jQuery UI Datepicker导致Internet Explorer崩溃

时间:2011-12-27 19:27:06

标签: jquery internet-explorer jquery-ui jquery-ui-datepicker

我遇到一个问题,jQuery UI的Datepicker导致Internet Explorer(版本8和9,可能是其他版本)有时(但不总是)崩溃。 IE在页面加载时或在使用datepicker字段后大约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="">

我可以通过导航到jsfiddle页面然后开始玩游戏(刷新,选择日期,跳出字段等等)来轻松地让IE崩溃。

当IE崩溃时,会显示一个对话框:“Internet Explorer已停止工作 - 导致程序无法正常工作的问题.Windows将关闭程序并在解决方案可用时通知您。”事件日志显示事件ID为1000的应用程序错误。

有什么建议吗?

~~~~~~~~~

更新:这确实得到了解决,但是我对于将其标记为已回答或提供真实答案犹豫不决,因为我不明白为了使其有效而改变了什么。所有出现的问题都发生在由IT人员分发的VM上。 IT人员在虚拟机上改变了一些东西(可能是Windows设置,也许?),问题就解决了。

1 个答案:

答案 0 :(得分:0)

如果我在初始化由互联网上某人建议的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');

不再有崩溃了。

我在底线发现了另一个奇怪的行为:DatePicker可以看到一个小矩形。当鼠标悬停时,这也会导致一些错误。但我找到了一个解决方案,在我的主模板中添加了一小段css之后的jquery.ui.css:

#ui-datepicker-div
{
    display: none;
}

所以我很高兴它可以在我想要的IE6,Chrome,Firefox中使用。

这是我对datepicker的最终初始化代码:

$('.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);
    }
  }
});

和我的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

米克洛斯