我有一个表,它有一个切换来显示/隐藏符合某些条件的各种行,我正在使用以下 JS 来实现我想要的(JSFiddle);
function resetRows() {
var i = 1,
tds;
var start = new Date().getTime();
$('td').removeClass('even odd');
$.each($('tr'), function (key, index) {
// loop through each table row skipping the first row which will be the title
tds = $(this).find($('td'));
if ($(this).is(':visible') && key > 0) {
if (i % 2 === 0) {
tds.addClass('even');
} else {
tds.addClass('odd');
}
// find the .index class and reset it's value
$(this).find($('.index')).html(i);
i++;
}
});
var end = new Date().getTime();
var time = end - start;
console.log('time taken: ' + time);
}
$(function () {
// show/hide failed
$('#showHideFails').on('click', function () {
if ($('.failed').eq(0).is(':visible')) {
$('.failed, .ins').hide();
$('.shTxt').html('Show all');
resetRows();
} else {
$('.failed, .ins').show();
$('.shTxt').html('Hide failed');
resetRows();
}
});
});
我的问题是这段代码执行得很慢。js 小提琴相对较快,因为我的示例表只有 15 行。我的实际表有 100 行,可以更改为显示 1,000 行。
我添加了一个控制台日志来测试它执行了多长时间,并且在小提琴中隐藏行需要大约 15 毫秒,再次显示行需要大约 20-40 毫秒。
在我有 100 行的真实表上,这变为隐藏约 300-450 毫秒,显示约 500-600 毫秒。当尝试 200 行(分别为 1,200 和 2,00)时,这个数字增加了一倍以上。当我尝试 1,000 行时,我的浏览器几乎崩溃了。
我尝试更改我的代码,而不是更改 's 的类名,而是更改了td
's 的类名,tr
因为理论上这意味着 jQuery 处理所需的处理更少,但这几乎使执行时间增加了一倍,所以我恢复了到td
的
谁能告诉我如何让我的代码更有效率?获得我想要的功能有点令人沮丧,只是让它运行得很慢。