jQuery datepicker在AJAX之后没有持久化

时间:2010-05-10 10:45:15

标签: binding datepicker jquery

所以我正在使用jQuery日期选择器,它运行良好。我正在使用AJAX来获取一些内容,显然当应用这个新内容时,绑定会丢失,我learnt about this last week并发现了.live()方法。

但是如何将它应用到我的日期选择器?因为这不是一个事件,因此.live()将无法帮助......对吗?

这是我用来将日期选择器绑定到输入的代码:

$(".datefield").datepicker({showAnim:'fadeIn',dateFormat:'dd/mm/yy',changeMonth:true,changeYear:true});

每次我的AJAX触发时,我都不想调用此方法,因为我希望尽可能保持通用。

干杯: - )

修改

正如@nick所要求的,下面是我的包装函数得到了ajax()方法:

var ajax_count = 0;
function getElementContents(options) {
    if(options.type===null) {
         options.type="GET";
    }

    if(options.data===null) {
        options.data={};
    }

    if(options.url===null) {
        options.url='/';
    }

    if(options.cache===null) {
        options.cace=false;
    }

    if(options.highlight===null || options.highlight===true) {
        options.highlight=true;
    } else {
        options.highlight=false;
    }

    $.ajax({
        type: options.type,
        url: options.url,
        data: options.data,
        beforeSend: function() {
            /* if this is the first ajax call, block the screen */
            if(++ajax_count==1) {
                $.blockUI({message:'Loading data, please wait'});
            } 
        },
        success: function(responseText) {
            /* we want to perform different methods of assignment depending on the element type */

            if($(options.target).is("input")) {
                $(options.target).val(responseText);
            } else {
                $(options.target).html(responseText);
            }
            /* fire change, fire highlight effect... only id highlight==true */
            if(options.highlight===true) {
                $(options.target).trigger("change").effect("highlight",{},2000);
            }
        },
        complete: function () {
            /* if all ajax requests have completed, unblock screen */
            if(--ajax_count===0) {
                $.unblockUI();
            }
        },
        cache: options.cache,
        dataType: "html"
    });
}

这个解决方案怎么样,我有一个rules.js,其中包括我对元素的所有初始绑定,如果我将它们放在一个函数中,然后在ajax方法的成功回调上调用该函数,那样我不会重复代码...

嗯,请问:D

3 个答案:

答案 0 :(得分:8)

你可以这样做:

function createPickers(context) {
  $(".datefield", context || document).datepicker({
    showAnim:'fadeIn',
    dateFormat:'dd/mm/yy',
    changeMonth:true,
    changeYear:true
  });
}

要在document.ready上投放,如果您已经拥有document.ready功能,可以致电:

createPickers();

或者您可以在it's own document.ready handle中运行它,如下所示:

$(createPickers);

success回调中,您可以这样称呼它:

createPickers(responseText);

这样做只是在提供的上下文中选择.datefield (在内部使用.find()),因此在document.ready您选择所有匹配的元素创建日期选择器,但在您的ajax请求中,您只选择刚刚到达响应的匹配元素,而不是在任何地方创建重复的日期选择器。

答案 1 :(得分:0)

第一个停靠点是阅读这个问题,如果你还没有:
jQuery live() failing with jQuery UI datepicker

“我已将它绑定到灯箱第一次出现时的灯箱输入,但之后无法正常工作。”

“当灯箱关闭时,我会将其内容重新附加到页面上(为了不丢失内容div),这似乎会杀死live()调用。”

答案 2 :(得分:0)

日期选择器是文本输入配合上的单击功能。所以你可以轻松地去:

$('#datepicker').live('click', function(){$(this).datepicker($.datepicker.regional['en']);})