问题是 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
方法中进行测试以首先检查null
值。但是,这忽略了回调被调用两次的核心问题。