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

あなたが本当に探しているように見えるのは、ブラウザがタイムアウトすることなくこれらの要素を削除できることです。タイムアウトが 0 の場合でも、window.setTimeout を使用して呼び出しを分割するとうまくいきます。以下のコードは、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 に答える
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 に答える
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()ことができるので、それも簡単になります。nm

于 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 に答える