【问题标题】:jQuery date picker not persistant after AJAXjQuery datepicker 在 AJAX 之后不持久
【发布时间】:2010-05-10 10:45:15
【问题描述】:

所以我正在使用 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

【问题讨论】:

  • 你的 ajax 怎么样了,$.ajax?您不重复代码的选项是使用上下文调用的函数或.liveQuery(),如果您有兴趣,我可以向您展示如何执行此操作,只需评论@nick并让我知道。跨度>
  • 嘿@nick,我已经编辑了我的原始帖子,另请参阅下面的可能解决方案... :-) 谢谢
  • 谢谢 :) 在下面发布了关于如何解决此问题的答案

标签: binding datepicker jquery


【解决方案1】:

你可以这样做:

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 请求中,您只选择刚刚到达响应中的匹配元素,而不是在任何地方创建重复的日期选择器。

【讨论】:

  • 好吧,这看起来是最好的解决方案。尼克你会建议我所有的绑定规则(如点击、更改等)都包含在一个函数中,然后我可以调用成功回调吗?那我可以不用.live()吗?只是想知道.live() 的局限性。谢谢:-)
  • @ILMV - 如果您不使用其他事件创建小部件,我会使用.live(),更简洁、更简单且事件​​处理程序更少。对于创建像datepicker 这样的小部件的东西,是的,我会将它们添加到一个采用这样的上下文的单个函数中。
  • 非常感谢您对 Nick 的帮助!
【解决方案2】:

如果您尚未阅读此问题,则首先要阅读此问题:
jQuery live() failing with jQuery UI datepicker

“我已经让它在灯箱第一次出现时绑定到灯箱的输入,但之后它就不起作用了。”

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

【讨论】:

  • 我不明白这与我有什么关系,因为它没有提供线索或答案?
【解决方案3】:

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

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

【讨论】:

  • 这将在每次点击元素时创建一个日期选择器小部件,这将非常浪费。
  • +1 尼克,我想避免这种可能的方法。无论如何,谢谢 XGreen。
猜你喜欢
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多