【问题标题】:Getting ‘Stop running this script’ message in IE7在 IE7 中获取“停止运行此脚本”消息
【发布时间】:2013-11-08 09:15:20
【问题描述】:

我需要在复选框单击时执行以下代码

            for (i = 0; i < dropDownCtrl.length; i++) {

                $("#dropDownCtrl option[value='" + dropDownCtrl[i].objName + "']").remove();
           }

但是,由于 dropDownCtrl.length 值较大,在 IE7 中收到“停止运行此脚本”消息。

谁能帮我把我的代码集成到下面给出的 URL 中提到的代码中,

http://www.picnet.com.au/blogs/Guido/post/2010/03/04/How-to-prevent-Stop-running-this-script-message-in-browsers

请帮忙。

【问题讨论】:

  • dropDownCtrl.length 的值是多少?
  • 为什么要停止错误消息?您可以改用for/in
  • 长度大于2000 怎么用for/in
  • 来自MDN 反正我不明白你的问题来自哪里。 IE 只处理 2000 个项目有什么问题?您是否有任何参考或您收到的确切错误消息
  • @Adriano IE7 不支持querySelector,这是 jQuery 用来使选择器快速运行的方法。因此,它必须解析字符串 2000 次,扫描页面上的所有元素 2000 次以寻找具有正确值的 value 属性(因为 CSS 选择器是从右到左解析的)。这是很多工作,IE7 会因此而死也就不足为奇了。而在我的回答中,不需要这种蛮力。

标签: jquery performance


【解决方案1】:

第一步:Don't use jQuery

var opts = document.getElementById('dropDownCtrl').options, lookup = {},
    l = dropDownCtrl.length, i;
// first use "lookup" as a quick lookup table - otherwise we'd have O(n*m) !
for( i=0; i<l; i++) lookup[dropDownCtrl[i].objName] = true;
// now we can do this in O(n+m), much better.
l = opts.length;
for( i=0; i<l; i++) {
    if( lookup[opts[i].value]) opts.parentNode.removeChild(opts[i]);
}

哒哒!现在应该快得多了。

【讨论】:

  • 在第 2 行 - : l = dropDownCtrl.length, i; dropDownCtrl 是一个变量吗?你声明了?
  • 考虑到您在自己的代码中使用了它,我当然希望它被声明!
  • 但是我的控件是一个 jQuery UI MultiSelect Widget,它可以工作吗?
  • 我不知道。我从未使用过如此野蛮的工具。如果它设计得很好,那么它应该可以正常工作,但我只是不知道。试试看。
【解决方案2】:

由于您使用的是 jQueryUI 多选控件并且 CheckAll 导致了该问题。 我尝试在导致超时的 _toggleChecked 事件中将 .each() 替换为 for 循环。更改后它的工作正常,没有任何脚本错误。

this.element
    .find('option')
    .each(function() {
     //if(!this.disabled && $.inArray(this.value, values) > -1) {
        self._toggleState('selected', flag).call(this);
      //}
    });

【讨论】:

  • 太棒了……非常感谢。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多