0

我有一个如下所示的每个循环

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

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

谢谢...

4

4 回答 4

1

好吧,在重新阅读您的问题后,我意识到我完全误解了您的意思。

这是我修改后的函数,允许您一次只处理数组的一小块“块”。但是,如果 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();
}

演示在这里

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

http://jsfiddle.net/rlemon/hAUcX/7/可读性较差但版本较小)这里是一个带有修改功能的演示。将超时从 0 更改为 1 毫秒时,我确实注意到了相当显着的感知性能差异。

于 2012-12-18T13:38:44.347 回答
1

您似乎真正在寻找的是能够在浏览器不超时的情况下删除这些元素。使用 window.setTimeout 拆分调用可以解决问题,即使超时为 0。下面的代码以 500 个批次执行此操作。

编辑:更新以提高性能。(谢谢伯吉。)

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)'));

这是小提琴

于 2012-12-18T13:50:35.440 回答
0

使用.each耦合内的参数引用return

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

您也可以使用.slice()仅选择 10 个项目,然后转到.each

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

如果您想在组中执行此操作,.slice()也会使这更容易,因为您基本上可以啜饮n元素并抓取m元素(然后处理该组)。

于 2012-12-18T13:25:41.723 回答
0

您可以通过使用计数器然后使用 break 语句在 10 次迭代后中断循环

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

});
于 2012-12-18T13:30:02.047 回答