3

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

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

TypeError: inst.div is null
inst.div.remove();

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

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

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

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

4

1 回答 1

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值。但是,这忽略了回调被调用两次的核心问题。

于 2013-02-26T19:58:43.950 回答