将 datepicker() 放在动态创建的元素上 - JQuery/JQueryUI

IT技术 javascript jquery jquery-ui datepicker
2021-01-29 03:40:22

我已经动态创建了文本框,我希望每个文本框都能够在点击时显示日历。我正在使用的代码是:

$(".datepicker_recurring_start" ).datepicker();

这只适用于第一个文本框,即使我所有的文本框都有一个名为 datepicker_recurring_start 的类。

非常感谢您的帮助!

6个回答

这是诀窍:

$('body').on('focus',".datepicker_recurring_start", function(){
    $(this).datepicker();
});​

演示

$('...selector..').on('..event..', '...another-selector...', ...callback...);语法手段:
添加一个监听器...selector..(在body我们的例子)的事件..event..(“焦点”在我们的例子)。对于与选择器匹配的匹配节点的所有后代...another-selector....datepicker_recurring_start在我们的示例中),应用事件处理程序...callback...(在我们的示例中为内联函数)

请参阅http://api.jquery.com/on/,尤其是有关“委托事件”的部分

这是一个适用于任何类型的动态附加的解决方案。+1 给你。
2021-03-22 03:40:22
虽然在我看来很奇怪,.datapicker()每次文本框获得焦点时都想调用- 所以你要小心这种方法(假设我没看错)。但是,我认为您可以接受,.datapicker()因为它可能会在尝试重新创建之前检查是否创建了日期选择器。使用其他代码,您可能没有这种优雅。此外, .on( 仅在 JQuery 1.7 中引入 - 所以请确保您使用正确的版本。
2021-03-28 03:40:22
当心在包含日期选择器的区域内使用 jQuery.clone()。如果这样做,请添加它以删除 hasDatepicker 类和 id datepicker 添加到您的输入中: .... find('input.hasDatepicker').removeClass('hasDatepicker').removeAttr('id');
2021-03-28 03:40:22
您可能想要添加过滤器 :not(.hasDatepicker)
2021-04-03 03:40:22
datepicker 足够聪明,可以检查它是否已经创建(顺便说一下所有 jQueryUI 组件)如果 jQuery 版本低于 1.7 你可以简单地使用live
2021-04-10 03:40:22

对我来说,下面的 jquery 有效:

将“正文”更改为文档

$(document).on('focus',".datepicker_recurring_start", function(){
    $(this).datepicker();
});

感谢skafandri

注意:确保每个字段的 id 都不同

正确 - 对我来说,我必须使用 $(document) 而不是 $('body') - 小代码片段的问题。我可以让示例正常工作,但是一旦我将一堆 javascript 添加到小提琴中,这段代码就不再适用于我。不过还是要感谢两位。
2021-04-03 03:40:22

skafandri +1 的出色回答

这只是更新以检查 hasDatepicker 类。

$('body').on('focus',".datepicker", function(){

    if( $(this).hasClass('hasDatepicker') === false )  {
        $(this).datepicker();
    }

});
那么可以缩短为$('body').on('focus',".datepicker:not(.hasDatepicker)", function(){$(this).datepicker();});?
2021-03-15 03:40:22

确保您的.date-picker元素还没有hasDatepicker类。如果是这样,即使尝试重新初始化$myDatepicker.datepicker();也会失败!相反,你需要做...

$myDatepicker.removeClass('hasDatepicker').datepicker();
非常正确!动态加载的元素最终对我来说不是问题,所以这个解决方案奏效了。
2021-04-02 03:40:22

您需要.datepicker();在动态创建其他文本框元素后再次运行

我建议在将元素添加到 DOM 的调用的回调方法中这样做。

因此,假设您正在使用 JQuery Load 方法从源中提取元素并将它们加载到 DOM 中,您将执行以下操作:

$('#id_of_div_youre_dynamically_adding_to').load('ajax/get_textbox', function() {
  $(".datepicker_recurring_start" ).datepicker();
});
根据我的经验,这在实践中并不总是有效。最好的情况是为您的元素添加唯一 ID,并使用这些 ID 来引用它们并应用日期选择器。似乎在内部插件使用这些选择器。
2021-04-06 03:40:22