Javascript需要很长时间才能运行

时间:2013-07-04 12:34:03

标签: javascript

我有一个脚本运行时间太长而且导致我这个错误就是:此页面上的脚本导致Internet Explorer运行缓慢。

我已经阅读了有关此错误的其他主题,并且已经了解到有一种方法可以通过在一定次数的迭代后放出一个时间来传递它。

请问我能否帮我暂停以下功能?

基本上每当我找到一个隐藏的输入类型提交或收音机我想删除,我有很多。请不要质疑为什么我有很多隐藏的投入。我做了它,我需要它只是帮我节省时间,所以我不会有JS错误。谢谢

$('input:hidden').each(function(){
    var name = $(this).attr('name');
    if($("[name='"+name+"']").length >1){
        if($(this).attr('type')!=='radio' && $(this).attr('type')!=='submit'){
            $(this).remove();
        }
    }
  });

我发现的一个例子:Bypassing IE's long-running script warning using setTimeout

5 个答案:

答案 0 :(得分:2)

您可能希望将input添加到jquery选择器以仅过滤掉输入标记。

if($("input[name='"+name+"']").length >1){

答案 1 :(得分:2)

这些相同的代码在没有使用setTimeout()的情况下优化了一点:

var $hidden = $('input:hidden'),
    el;
for (var i = 0; i < $hidden.length; i++) {
  el = $hidden[i];
  if(el.type!=='radio' && el.type!=='submit'
             && $("[name='" + el.name + "']").length >1) {

     $(el).remove();
  }
}

请注意,现在每次迭代最多有三个函数调用,而原始代码每次迭代最多有十个函数调用。当你只能说$(this).attr('type')(没有函数调用)时,就不需要this.type(两个函数调用)。

此外,.remove()仅在三个条件为真,两个type测试并检查其他同名元素时才会发生。首先进行type测试因为它们很快,而且只有在type部分通过时才会对其他元素进行慢速检查。 (如果左手操作数是假的,JS的&&不评估右手操作数。)

setTimeout()

var $hidden = $('input:hidden'),
    i = 0,
    el;
function doNext() {
   if (i < $hidden.length) {
      el = $hidden[i];
      if(el.type!=='radio' && el.type!=='submit'
                && $("[name='" + el.name + "']").length >1) {

         $(el).remove();
      }
      i++;
      setTimeout(doNext, 0);
   }
}
doNext();

您可以通过更改$("[name='" + el.name + "']")来指定特定元素类型来改进任一版本,例如,如果您只使用$("input[name='" + el.name + "']")进行输入。您也可以通过某个容器进行限制,例如,这些输入是否都在某种形式或类似内容中。

答案 2 :(得分:1)

看起来你引用的例子正是你所需要的。我想如果你拿代码并替换示例中的while循环(保留if语句来检查批量大小),你基本上就完成了。你只需要一个突破循环的jQuery版本。

答案 3 :(得分:1)

试试这个:

$("[type=hidden]").remove(); // at the place of each loop

删除所有隐藏字段需要很短的时间。

我希望它会有所帮助。

JSFiddle example

答案 4 :(得分:1)

冒险说明显而易见;遍历DOM寻找与这些CSS选择器的匹配是使代码变慢的原因。你可以通过一些简单的技巧减少它所做的工作量:

这些字段是否在特定元素中?如果是这样,您可以通过在选择器中包含该元素来缩小搜索范围。

e.g:

$('#container input:hidden').each(function(){
    ...

您还可以缩小为name属性

检查的字段数

e.g:

if($("#container input[name='"+name+"']").length >1){

我也不清楚为什么一旦找到了隐藏的元素,你就会$("[name='"+name+"']").length >1再次搜索 。你没有解释这个要求。如果你不需要,那么你可以通过取出它来加快速度。

$('#container input:hidden').each(function(){
    var name = $(this).attr('name');
    if($(this).attr('type')!=='radio' && $(this).attr('type')!=='submit'){
        $(this).remove();
    }
});

如果您 需要它,并且我很想知道原因,但最好的方法可能是重新构建代码,以便它只检查给定的输入数量命名一次,并一次性删除它们。