2012-12-18 37 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