jQuery UI Datepicker导致ie浏览器崩溃



我遇到了一个问题,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

最新更新