【问题标题】:Keith Wood Datepick in ie9 doesn't work on clickie9 中的 Keith Wood Datepick 在点击时不起作用
【发布时间】:2013-02-12 06:32:19
【问题描述】:

我在 JQuery 1.8.2 中使用 Keith Wood Datepick plugin。我有两个日历日期选择器输入。用户单击第一个输入(显示日历),然后单击下一个输入,因此显示第二个日历,关闭第一个。

在这一步中,在FF中发生了这个错误:

类型错误:inst.div 为空
inst.div.remove();

但继续工作。但是,在 Internet Explorer 9 上的同一步骤中,插件停止运行并且不再工作。我需要刷新页面以恢复功能。这是我的 JavaScript 代码:

$(function() {
     $('#date1,#date2').datepick();
});

请查看此示例:http://jsfiddle.net/wjwa5/8/

它适用于 jQuery 1.4.4,但我需要它在 1.8.2 版本中工作。

【问题讨论】:

  • 您没有使用最新版本的 Datepicker (4.1.0) 是否有特定原因?您使用的版本(4.0.6)是近两年前发布的,这意味着它可能是使用 jQuery 1.4 或 1.5 开发的。
  • 不,是我开始项目时发现的第一个。 Wooow,用最新版本更新,它工作得很好!谢谢你
  • 是的,添加的错误似乎是一个相当糟糕的解决方法。如果您有兴趣,我会提供更多关于出了什么问题以及如何更好地解决问题的详细信息作为答案。

标签: jquery jquery-plugins datepicker internet-explorer-9


【解决方案1】:

问题在于 Datepicker hide() 方法假设 jQuery 如何处理它自己的 hide() 方法的参数。也就是说,回到 jQuery 1.4.4,如果你打了这样的电话

$('#some-element').hide('',someCallback)

jQuery 会认为第一个元素是speed 参数,除非该参数满足表达式

speed || speed === 0

jQuery 将忽略参数并像以前一样执行函数

$('#some-element').hide()

这意味着回调永远不会被调用

好吧,为 Datepicker 实现代码的人认识到了这种行为,并没有更改参数以正确触发回调,而是想出了手动调用回调的解决方法。

这是 4.0.6(OP 版本)的摘录

else { 
  // Note: This branch will always execute when one datepicker opening
  //       triggers the closing of another. Moreover, showAnim === ''
  var hideAnim = (showAnim == 'slideDown' ? 'slideUp' :
    (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'));
  inst.div[hideAnim]((showAnim ? showSpeed : ''), postProcess);
}
if (!showAnim) {
  postProcess();
}

当一个日期选择器的打开触发另一个日期选择器的关闭时,上面的代码将缩减为

inst.div.hide('', postProcess); // this is the jQuery.fn.hide function
postProcess();

效果很好...在 jQuery 1.4.4 中。

然而,从那时起,jQuery 得到了改进,如果你将回调传递给 hide 方法,jQuery 将确保它在完成时被调用。因此,您遇到的问题是回调 postProcess 被调用了两次。

分辨率

要解决这个问题,使其不再在以后的 jQuery 版本中引发异常,您只需要消除/注释掉这些行

if (!showAnim) {
  postProcess();
}

如果您还希望修复与旧 jQuery 版本向后兼容,您还应该更改

inst.div[hideAnim]((showAnim ? showSpeed : ''), postProcess);

inst.div[hideAnim]((showAnim ? showSpeed : 0), postProcess);

Plunk(使用 4.1.0)

注意:4.1.0 中引入了一种解决方法,它只是在 postProcess 方法中进行测试以首先检查 null 值。但是,这忽略了回调被调用两次的核心问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2023-03-15
    相关资源
    最近更新 更多