1
function removeTds() {
    var elements = $('#goldBarList tr:not(:eq(0))').filter(':has(:checkbox:checked):lt(50)');
    var count = elements.length;
    elements.each(function() {
        grossWeightTotal = grossWeightTotal - $('#goldBarList tr:eq(' + $(this).index() + ') td:eq(8)').text();
        netWeightTotal = netWeightTotal - $('#goldBarList tr:eq(' + $(this).index() + ') td:eq(9)').text();
        fineOunceTotal = fineOunceTotal - $('#goldBarList tr:eq(' + $(this).index() + ') td:eq(10)').text();
    });
    elements.remove();
    if(count === 50) window.setTimeout(removeTds, 1);
}
removeTds();

上記のコードを実行すると、「このスクリプトの実行を停止しますか?」というメッセージが表示されます。促す。私は4000のレコードを持っています。

4

1 に答える 1

8

あなたのコードは本質的に遅く、最適化$(this).index()可能です (キャッシュなど) が、最大の問題は、50*N レコード (たとえば 4000...) がある場合、ブラウザーに関数を 1 ミリ秒ごとに実行するように要求することです。

一度にすべてを簡単に掃除できます。

例えば ​​:

function removeTds() {
    var elements = $('#goldBarList tr:not(:eq(0))').filter(':has(:checkbox:checked)');
    elements.each(function() {
        var index = $(this).index();
        grossWeightTotal = grossWeightTotal - $('#goldBarList tr:eq(' + index + ') td:eq(8)').text();
        netWeightTotal = netWeightTotal - $('#goldBarList tr:eq(' + index + ') td:eq(9)').text();
        fineOunceTotal = fineOunceTotal - $('#goldBarList tr:eq(' + index + ') td:eq(10)').text();
    });
    elements.remove();
}
removeTds();

チェックボックスが変更されたときにクリーンアップをやり直したい場合は、次を追加します。

$('input[type="checkbox"]').change(removeTds);

もちろん、ボタンにバインドすることもできます:

$('#removeButton').change(removeTds);
于 2012-12-19T09:51:24.790 に答える