我遇到了一个问题,jQuery UI的Datepicker导致Internet Explorer(版本8和9,可能其他)有时(但不总是)崩溃。IE有25%的时间会在页面加载或更改日期选择器字段后崩溃。这可能是Windows 7特有的,也可能不是。我可以使用从1.6.2到1.7.1的各种不同版本的jQuery重现这个问题。
http://jsfiddle.net/wLW8D/<script>
$(function() {
$('#someDate').datepicker();
});
</script>
<input type="text" name="someDate" id="someDate" value="">
我可以让IE崩溃相当容易通过导航到jsfiddle页面,然后开始玩(刷新,选择一个日期,标签出字段等)。
当IE崩溃时,显示一个对话框:"Internet Explorer已停止工作-一个问题导致程序停止正常工作。"Windows将关闭该程序,并在有解决方案时通知您。"事件日志显示一个事件ID为1000的应用程序错误。
有什么建议吗?
~~~~~~~~~
更新:这确实得到了解决,但我犹豫是否将其标记为回答或提供真正的答案,因为我不明白改变了什么使其工作。所有出现的问题都发生在由IT人员分发的VM上。IT人员对虚拟机进行了一些更改(可能是Windows设置,也许?),问题得到了解决。
如果我在初始化DatePicker元素时做了类似的事情这是网上有人建议的:
$('.DatePicker').datepicker({
onChangeMonthYear: function(year, month, inst) {
var now = new Date(this.value);
if (now) {
var max = new Date(year, month, 0).getDate();
var day = now.getDate() > max ? max : now.getDate();
var newDate = new Date(year, month-1, day);
inst.input.datepicker('setDate', newDate);
}
}
});
(当然,我在所需的输入元素处附加了class=DatePicker)
更改日期时IE总是崩溃
如果我提交onChangeMonthYear处理程序或者只是注释掉inst.input.datepicker…行,问题就消失了(当然在这种情况下所需的功能也消失了)。
于是我又做了一些实验,发现问题出在第一行:
var now = new Date(this.value);
这里我们尝试从输入字段值构造一个Date变量。看起来IE在格式本地化时不构建(比如在我匈牙利),所以结果将是NaN。看来这才是真正的问题。不管怎样,Chrome和Firefox都能正常工作,这对我来说很奇怪。
所以我把第一行改成:var now = inst.input.datepicker('getDate');
没有崩溃了。
我发现另一个奇怪的行为在底线:一个小矩形是可见的日期picker。这也会导致鼠标悬停时出现一些错误。但是我也找到了一个解决方案,在jquery.ui.css之后添加一小块css在我的主模板:
#ui-datepicker-div
{
display: none;
}
所以我很高兴它在IE6, Chrome, Firefox中工作,正如我想要的。
这是我最后的初始化代码:
$('.DatePicker').datepicker({
onChangeMonthYear: function(year, month, inst) {
var now = inst.input.datepicker('getDate');
if (now) {
var max = new Date(year, month, 0).getDate();
var day = now.getDate() > max ? max : now.getDate();
var newDate = new Date(year, month-1, day);
inst.input.datepicker('setDate', newDate);
}
}
});
和my datetimepicker:
$('.DateTimePicker').datetimepicker({
onChangeMonthYear: function(year, month, inst) {
var now = inst.input.datepicker('getDate');
if (now) {
var max = new Date(year, month, 0).getDate();
var day = now.getDate() > max ? max : now.getDate();
var newDate = new Date(year, month-1, day,
now.getHours(), now.getMinutes(), now.getSeconds());
inst.input.datepicker('setDate', newDate);
}
}
});
我使用jQuery 1.7.1和jQuery .ui.1.8.16
米