2013-07-04 193 views
1

我有一个耗时太长的脚本,这导致了我ie上的这个错误:此页面上的脚本导致Internet Explorer运行缓慢。Javascript花费太长时间运行

我读过关于这个错误的其他线程,并且已经知道有一种方法可以通过在经过一定次数的迭代之后放一段时间来传递它。

你能帮我申请下列功能吗?

基本上每次我找到隐藏的输入类型提交或无线电我想删除,我有很多。请不要质疑为什么我有很多隐藏的输入。我做了BC,我需要它只是帮我把时间请出来,所以我不会有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(); 
     } 
    } 
    }); 

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

+2

停止执行'$(this)',而是将其分配给一个变量 –

+1

在评论之前,请务必阅读代码,将$ this放入一个变量中,或者将其保持不变。 – Joseph

+0

您有多少输入可以让这么小的脚本“长时间运行”? – Bergi

回答

1

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

+0

虽然长时间运行的循环可能已经在$('input:hidden')'里面了...... – Bergi

+0

谢谢先生,那也一样工作:) – Joseph

2

您可能需要将input添加到您的jquery选择器,以仅过滤输入标记。

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

完美:)。尽管我想学习如何超时以绕过错误。谢谢 – Joseph

1

试试这个:

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

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

我希望这会有所帮助。

JSFiddle example

+1

但是OP的代码不会只删除'type =“hidden”'字段。 ':hidden'选择器也返回隐藏CSS的东西。 OP的代码根据每个元素的“名称”进行测试... – nnnnnn

+0

它将删除隐藏类型为隐藏类型的所有隐藏字段。

1

致危说明明显;遍历DOM查找匹配这些CSS选择器是什么让你的代码变慢。您可以通过几个简单的技巧减少工作量:

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

如:

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

您也可以缩小这种检查对于name属性的字段数

如:

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

如果需要它,我会很想知道为什么,但最好的办法可能是重组的代码,以便它只检查的给定名称的输入数一次,并一次性去除它们。

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.type(没有函数调用)时,不需要例如$(this).attr('type')(两个函数调用)。

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

或者与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 + "']")。你也可以限制某个容器,例如,如果这些输入都是某种形式或某种东西。

+0

我正在寻找的答案和更多。谢谢先生 – Joseph

+0

user2515601,你应该把@nnnnnn's标记为最好的答案......因为它是。 :) – David

+0

谢谢user2515601和@David。我只是稍微调整了我的答案,改变了“if”测试条件的顺序,以便只有在其他人通过时才评估慢速测试条件。 (请注意,我实际上并没有测试任何代码,但它应该足够清楚,可以给出你的想法......) – nnnnnn