我使用以下代码:
$("#dataTable tbody").on("click", "tr", function (event) {
if (!$(this).hasClass('row_selected')) {
$(oTable.fnSettings().aoData).each(function () {
$(this.nTr).removeClass('row_selected');
});
$(this).addClass('row_selected');
gridClickHandler($(this));
}
});
单击一行时,如果已选择该行,则不会发生任何操作。如果没有,那么所有行都删除了类,并且当前行添加了row_selected类。
然而这很慢,因为我的表有很多行。目前的延迟看起来不太好。我想到的是将addClass移动到开头。但是,如果我这样做,.each循环将删除它。
有没有办法让这项工作更有效率(更快的响应)?
<table id-"dataTable">
<tbody>
<tr>
<td>January</td>
<td>$100</td>
</tr>
<tr>
<td>February</td>
<td>$80</td>
</tr>
</tbody>
</table>
答案 0 :(得分:3)
$('table').on('click', 'tr', function() {
var row = $(this); //cache the row
if(!row.hasClass('selected'){
row.addClass('selected') //add class to clicked row
.siblings() //get the other rows
.removeClass('selected'); //remove their classes
gridClickHandler(row);
}
});
使用.on()
的优点是它只将一个事件处理程序绑定到子节点(在本例中为table
),用于子节点{{1} })。在每一行上使用tr
意味着每个 .click()
元素都有一个处理程序,这是一个开销。
例如,如果我有一千行,当你使用tr
而不是只点击.click()
上的处理程序来监听所有{{1}时,会有一千个点击处理程序使用table
时点击事件。
答案 1 :(得分:0)
$("#dataTable tbody tr").click(function () {
$('#dataTable tbody tr.selected').removeClass('selected');
$(this).addClass('selected');
gridClickHandler($(this));
});
检查此jsfiddle,即使使用大表也能快速运行!
- 评论后编辑 -
答案 2 :(得分:0)
试试这个: -
$("#dataTable tbody tr").on("click", "tr", function (event) {
$("#dataTable tbody tr").removeClass('row_selected');
$(this).addClass('row_selected');
}
});
答案 3 :(得分:0)
$("#dataTable").on("click", "tr", function (e) {
var $this = $(this);
// this line removes all selected classes from the rows siblings
$this.siblings().removeClass("row_selected");
// this line will toggle the selected class,
// therefore deselecting the row if it has been selected before
$this.toggleClass("row_selected");
gridClickHandler($this);
});
或者缓存先前选择的行。
(function() {
var $oldSelected = null;
$("#dataTable").on("click", "tr", function (e) {
var $this = $(this);
// this line removes all selected classes from the rows siblings
$oldSelected.removeClass("row_selected");
// this line will toggle the selected class,
// therefore deselecting the row if it has been selected before
$oldSelected = $this.addClass("row_selected");
gridClickHandler($this);
});
})();
作为旁注,缓存jQuery调用 - 或者你需要反复进行的函数调用的结果 - 总是一个节省处理时间的好主意。