2012-12-18 34 views
0

我有一个每个环路像下面10次迭代后如何设置setTimeout?

$('#goldBarList tr:not(:eq(0))').filter(':has(:checkbox:checked)').each(function() { 
    $(this).remove(); 
}); 

,因为我有4000行和每行具有复选框。我需要删除那些复选框被选中的行。
但是,浏览器正在停止运行此脚本错误?
,因为此循环需要更多时间才能完成。
所以我只想使用setTimeout 10次迭代后,并继续循环后0.5秒..
意味着我希望循环睡眠为每10次迭代后1/2秒.. 请给我一些代码参考...

谢谢...

+1

为什么你需要这样一个(太)巨大的桌子? – Bergi

+0

添加一个计数器变量,然后在循环内增加它 – SaidbakR

+3

4000行?你应该看看分页。 – jbabey

回答

1

看起来您真正需要的是能够在浏览器超时的情况下移除这些元素。使用window.setTimeout分割调用是有用的,即使超时时间为0.下面的代码以500的批次执行此操作。

编辑:已更新,以提高性能。 (Thanks Bergi。)

var removeTds = function($el) { 
    var elements = $el.filter(":lt(500)"), 
     count = elements.length; 

    elements.remove(); 
    $el = $el.filter(":gt(499)"); 
    if (count === 500) { 
     window.setTimeout(function() { 
      removeTds($el); 
     }, 0); 
    } 
}; 

removeTds($('tbody tr:not(:eq(0))').filter(':has(:checkbox:checked)')); 

这里是fiddle

+0

谢谢你...非常感谢你... – user1912935

+0

非常欢迎。很高兴为您提供帮助,感谢upvote!我过去也遇到类似的问题,我知道他们可能会很痛苦。 – Grinn

+0

你不应该每次都做这个选择。 – Bergi

0

使用.each内的参数参考加上return

$(...).each(function(i,e){ 
    if (i >= 10) return; // dtop after 10 iterations 
    // original code 
}) 

您还可以使用.slice()到塞莱CT只有10个项目,然后移动到.each

$(...).slice(0,10).each(function(){ 
    // original code 
}); 

如果你想在小组执行此,.slice()也将简化这个过程,你基本上可以品尝n元素和抢m元素(然后处理该组)。

+0

当我试图使用中断...它说像不能打破循环外......我不想打破循环..我想使循环睡眠1/2秒后的1/2秒。然后继续...在10次迭代后再次睡眠...像明智的我想... – user1912935

+0

@user:哎呀,仍然醒来。改用'return'。 –

0

您可以通过在重新阅读您的问题用一个计数器,然后break语句

var i = 0; 
$('#goldBarList tr:not(:eq(0))').filter(':has(:checkbox:checked)').each(function() { 
    if(i >= 10) 
    { 
     break; 
    } 
    else 
    { 
     $(this).remove(); 
     i++; 
    } 

}); 
+1

不能在循环外打破...我不想打破循环..我想在10次循环后让循环睡眠1/2秒..然后在10次迭代睡眠后再次继续...。 ..就像明智的我想... – user1912935

+0

你不能在'.each()'-loop中打破',这是一个语法错误 – Bergi

1

那么在10次迭代打破循环,我意识到我完全错误理解你。

这里是我修改后的函数,它允许你一次只处理一个小块数组。但是,如果DOM回流引起您头痛的问题,请尝试使用文档片段先构建树。

修订答:

function _each(arr, fn/*callback(elem,i)*/, limit/*items per pass*/) { 
    limit = limit || 10; 
    var count = 0, 
     len = arr.length; 

    function run() { 
     var d = limit; 
     while (d-- && len >= count) { 
      fn(arr[count], count++); 
     } 
     if (len > count) setTimeout(run, 1000); // one second is just to show you it working. 
    } 
    run(); 
} 

Demo here

在回答这个问题后,我看到了一些扩展方法的一些价值,以接受完整的回调。

http://jsfiddle.net/rlemon/hAUcX/7/less readable but smaller version)这里是一个演示,修改后的函数。将超时值从0更改为1毫秒时,我注意到相当显着的性能差异。

+0

简化为while while(d-- && len Bergi

+1

@Bergi很好的电话。我错过了清理代码的时候:)但是它需要'while(d-- && len> = count)fn(arr [count],count ++);'保持相同的功能。 – rlemon