我正在使用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版本中工作。
答案 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);
注意:在 4.1.0 中引入了一种解决方法,它只是在postProcess
方法中放置测试以检查{{1}首先是价值观。但是,这忽略了回调被调用两次的核心问题。