单击一行时,如何将“选定”类添加到表的一行?

时间:2012-08-01 11:25:54

标签: javascript jquery

我使用以下代码:

$("#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> 

4 个答案:

答案 0 :(得分:3)

Here's a sample

$('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调用 - 或者你需要反复进行的函数调用的结果 - 总是一个节省处理时间的好主意。