ie9中的Keith Wood Datepick在点击时不起作用

时间:2013-02-26 17:23:39

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

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

在此步骤中,在FF中发生此错误:

  

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

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

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

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

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

1 个答案:

答案 0 :(得分: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方法中放置测试以检查{{1}首先是价值观。但是,这忽略了回调被调用两次的核心问题。