我有一個函數,檢查edit-error
類的表的每一行中的每個單元格。如果在特定行的任何單元格中找到該單元格(單元格值未通過驗證),則從整行中刪除類別,並取消選中該行的第一個td
中的複選框。在性能上掙扎如何將其更改爲使用for循環?
當有大量的行(1,000+)時,我在性能上掙扎不已,所以我想我可以嘗試循環,但我不是JavaScript專家,所以我正在尋找幫助。
原始代碼如下:
var checkErrors = function() {
$('#results tr:not(:first)').each(function() {
$('td:first input:checkbox', $(this)).attr('checked', 'checked');
$(this).addClass('edit-submit');
$(this).find('td').each(function() {
if ($(this).hasClass('edit-error')) {
$('td:first input:checkbox', $(this).parent('tr')).removeAttr('checked');
$(this).parent().removeClass('edit-submit');
}
});
});
}
該表具有的#results
一個id。我首先要做的是檢查所有的複選框,並將edit-submit
類添加到每一行,然後遍歷所有單元格檢查錯誤。
我在尋找任何有關此功能性能改進的幫助。
編輯
這本來是有意義的添加表HTML。對於道歉那就是:
<table id="results">
<tbody>
<tr>
<th> </th>
<th>Policy Number</th>
<th>Quota Code</th>
<th>Contract Date</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td class="edit-error">ABC123%</td>
<td>123</td>
<td class="edit-error">99/99/9999</td>
</tr>
<tr class="edit-submit">
<td><input type="checkbox" checked="checked"></td>
<td>ABC123</td>
<td>123</td>
<td>16/03/2012</td>
</tr>
</tbody>
</table>
這將在頁面上顯示:
-------------------------------------------------- | | Policy Number | Quota Code | Contract Date | -------------------------------------------------- | | ABC123% | 123 | 99/99/9999 | -------------------------------------------------- | X | ABC123 | 123 | 16/03/2012 | --------------------------------------------------
':first'是非標準的CSS,這意味着jQuery不能使用可用的(快速)本機選擇器。嘗試刪除':first'並使用'.eq(0)'代替(和':not(:first)' - >'.slice(1)')。 – pimvdb 2012-03-16 10:11:38
我仍然想知道如果使用for循環會比jQuery .each()函數更快。有人會同意我的意見或正在使用.each()的方式去? – 2012-03-16 10:42:26
是的,plain for循環一定比'.each()'快。我在回答中包含了一種方法。但是,在你的代碼中還有其他一些東西可以提高效率,所以我將最後一次優化循環本身。 – nnnnnn 2012-03-16 10:59:20