测试元素是不是已经有 jQuery datepicker

Posted

技术标签:

【中文标题】测试元素是不是已经有 jQuery datepicker【英文标题】:Test if element already has jQuery datepicker测试元素是否已经有 jQuery datepicker 【发布时间】:2011-02-04 11:34:52 【问题描述】:

我有一个包含许多输入元素的表单。有些是带有 jQ​​uery UI datepicker alraedy 的日期字段:

$("#someElement").mask("9?9/99/9999").datepicker(showOn: 'button', buttonText:'Click here to show calendar', duration: 'fast', buttonImageOnly: true, buttonImage: /images/calicon.gif' );

然后我有一个键命令绑定到这个函数:

function openCalendar() 
    var selection = document.activeElement;

    //  Need to test here if datepicker has already been initialized 
        $(selection).datepicker("show");
    // 

这对于已经有日期选择器的元素非常有用。但是,任何其他字段都会引发 javascript 错误。我想知道测试日期选择器是否已经在该字段上初始化的最佳方法。

【问题讨论】:

【参考方案1】:

哇,简直不敢相信我错过了这个。 ui.datepicker.js 的第 108 行:

/* Class name added to elements to indicate already configured with a date picker. */
markerClassName: 'hasDatepicker',

所以我只需要测试hasClass('hasDatepicker')。这似乎是最直接的方法。此外,此语句检查日期选择器当前是否打开(对于任何感兴趣的人):

if ($("#ui-datepicker-div").is(":visible") && $("#ui-datepicker-div").html() != "") 
    // datepicker is open. you need the second condition because it starts off as visible but empty

【讨论】:

要检查 jQuery UI 自动完成是否已初始化,我使用了这个:$('#myinput').is(':data(autocomplete)')。我认为这也适用于日期选择器。 仅仅因为标记类存在并不总是意味着日期选择器在节点上。在 Datatables 中,当它切换到卡片视图时,日期选择器会从节点中删除,但类仍然存在!因此,如果需要重新绑定,则需要添加上述额外检查并删除该类,因为 datepicker 在内部使用该类作为代理来防止多次绑定。【参考方案2】:

1)如果代码在尝试打开日期选择器时抛出错误,可以将代码放入try..catch中

2) 初始化日期选择器时可以给输入字段设置一些数据

$("#someElement").data("datepicker-initialized", true);

3) 您可以使用 datepicker 插件存储的数据

if($("#someElement").data("datepicker") != null)
   // datepicker initialized

if($.data($('#someElement').get(0), 'datepicker'))
   // datepicker initialized

4) datepicker 内部使用函数 _getInst

if($.datepicker._getInst($('#someElement')[0]) != null)

该方法与示例 3 几乎相同。

找不到更好的解决方案。

【讨论】:

谢谢!这对我帮助很大。 if($("#someElement").data("datepicker") !== null) 不完全正确,因为data() 返回undefined,而不是null。不过,不那么严格的!= 比较也有效。 我检查了 jQuery 1.5,它是 2010 年 4 月的最新版本,以确保它返回 undefinednull。它返回undefined。我更新了我的答案。感谢您的评论。【参考方案3】:

一个基本的解决方案是在日期选择器附件时设置一个属性,然后对其进行测试:

$("#someElement").mask("9?9/99/9999")
.datepicker(showOn: 'button', buttonText:'Click here to show calendar', duration: 'fast', buttonImageOnly: true, buttonImage: /images/calicon.gif' )
.attr("data-calendar", "true");

那么你可以这样做:

if ($(selection).attr("data-calendar") == "true")
    $(selection).datepicker("show");

有没有更直接的方法?

【讨论】:

我喜欢这种方法,但我会使用addClass("data-calendar"),这样您就可以使用这样的简单选择器:$(".data-calendar").datepicker("show");【参考方案4】:

我还有一个案子。 我的脚本正在复制最后一个表格元素,包括日期选择器。

jquery 将无法工作,因为复制的元素已标记为“hasDatepicker”。

要在新元素中激活日期选择器,请删除该类名并启动它,如下所示。

 $("#yournewelementid").attr("class","your-class-name"); 
 $("#yournewelementid").datepicker();    

【讨论】:

【参考方案5】:

如果 section 是 datepicker 的 dom 元素,请检查是否已经初始化,如果没有先将其初始化为 datepicker(您可以添加属性)然后显示它!

    // If already initialized        
    if ( typeof selection !== 'undefined' && selection.length > 0)
         $(selection).datepicker('show');
    // otherwise initialize first and show
    else 
         $(selection).datepicker().datepicker('show');

【讨论】:

请不要只在答案中提供一大堆代码。给出一些背景和解释,说明您为什么认为这可以解决问题。我们的想法是创建一个问答体系,以帮助这些特定的人未来的其他人提供一般有用的信息。【参考方案6】:

这是我的解决方案:)

if(typeof jQuery.fn.datepicker !== "undefined")

【讨论】:

这是测试当前窗口中是否有日期选择器可用,而不是在输入时。

以上是关于测试元素是不是已经有 jQuery datepicker的主要内容,如果未能解决你的问题,请参考以下文章

有效地测试元素是不是会在 jQuery 集合中

测试元素是不是已经有 Bootstrap 日期选择器

我如何测试 jQuery 是不是隐藏了某些东西? [复制]

怎样判断jQuery 元素是不是显示与隐藏

jQuery 元素是不是显示与隐藏的判断

发现任何元素是不是在 jQuery 中具有任何类