How to tell which row number is clicked in a table?

前端 未结 6 498
陌清茗
陌清茗 2020-12-01 03:28

I have a table like the following:

相关标签:
6条回答
  • 2020-12-01 03:53

    In some cases we could have a couple of tables, and then we need to detect click just for particular table. My solution is this:

    <table id="elitable" border="1" cellspacing="0" width="100%">
      <tr>
     <td>100</td><td>AAA</td><td>aaa</td>
      </tr>
      <tr>
    <td>200</td><td>BBB</td><td>bbb</td>
       </tr>
       <tr>
    <td>300</td><td>CCC</td><td>ccc</td>
      </tr>
    </table>
    
    
        <script>
        $(function(){
            $("#elitable tr").click(function(){
            alert (this.rowIndex);
            });
        });
        </script>
    

    DEMO

    0 讨论(0)
  • 2020-12-01 03:59

    A simple and jQuery free solution:

    document.querySelector('#elitable').onclick = function(ev) {
       // ev.target <== td element
       // ev.target.parentElement <== tr
       var index = ev.target.parentElement.rowIndex;
    }
    

    Bonus: It works even if rows are added/removed dynamically

    0 讨论(0)
  • 2020-12-01 04:01

    You can use object.rowIndex property which has an index starting at 0.

    $("table tr").click(function(){
        alert (this.rowIndex);
    });
    

    See a working demo

    0 讨论(0)
  • 2020-12-01 04:05
    $('tr').click(function(){
     alert( $('tr').index(this) );
    });
    

    For first tr, it alerts 0. If you want to alert 1, you can add 1 to index.

    0 讨论(0)
  • 2020-12-01 04:07

    A better approach would be to delegate the event, which means catching it as it bubbles to the parent node.

    delegation - overview

    This solution is both more robust and efficient.

    It allows the event to be handled even if more rows are dynamically added to the table later, and also results in attaching a single event handler to the parent node (table element), instead of one for each child node (tr element).

    Assuming that the OP's example is a simplified one, the table's structure can be more complex, for example:

    <table id="indexedTable">
        ...
        <tr>
            <td><p>1</p></td>
            <td>2</td>
            <td><p>3</p></td>
        </tr>
    </table>
    

    Therefore, a simplistic approach such as getting e.target.parentElement will not work, as clicking the internal <p> and clicking the center <td> will produce different results.

    Using delegation normalizes the event handling, only assuming that there are no nested tables.

    implementation

    Both of the following snippets are equivalent:

    $("#indexedTable").delegate("tr", "click", function(e) {
        console.log($(e.currentTarget).index() + 1);
    });
    
    $("#indexedTable").on("click", "tr", function(e) {
        console.log($(e.currentTarget).index() + 1);
    });
    

    They attach a listener to table element and handle any event that bubbles from the table rows. The current API is the on method and the delegate method is legacy API (and actually calls on behind the scenes).

    Note that the order of parameters to both functions is different.

    example

    A comparison between direct handler attachment and delegation is available below or on jsFiddle:

    $("#table-delegate").on("click", "tr", function(e) {
      var idx = $(e.currentTarget).index() + 1;
      $("#delegation-idx").text(idx);  
      console.log('delegated', idx);
    });
    
    $("#table-direct tr").on("click", function(e) {
      var idx = $(e.currentTarget).index() + 1;
      $("#direct-idx").text(idx);
      console.log('direct', idx);
    });
    
    $('[data-action=add-row]').click(function(e) {
      var id = e.target.dataset.table;
      $('#' + id + ' tbody')
        .append($('<tr><td>extra</td><td>extra</td><td>extra</td></tr>')[0])
    });
    tr:hover{
        background:#ffffd;
    }
    
    button.add-row {
        margin-bottom: 5px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
    
    
    <h1>Event handling test</h1>
    <p>Add rows to both tables and see the difference in handling.</p>
    <p>Event delegation attaches a single event listener and events related to newly added children are caught.</p>
    <p>Direct event handling attaches an event handler to each child, where children added after the inital handler attachment don't have a handler attached to them, and therefore their indices won't be logged to console.</p>
    <h2>Delegation</h2>
    <p><span>row index: </span><span id="delegation-idx">unknown</span></p>
    <button class="add-row" data-action="add-row" data-table="table-delegate">Add row to delegation</button>
    <table id="table-delegate" class="table">
        <tbody>
        <tr>
            <td>normal</td>
            <td>normal</td>
            <td>normal</td>
        </tr>
        <tr>
            <td><p>nested</p></td>
            <td><p>nested</p></td>
            <td><p>nested</p></td>
        </tr>
        <tr>
            <td>normal</td>
            <td>normal</td>
            <td><p>nested</p></td>
        </tr>
    
    </table>
    
    <h2>Direct attachment</h2>
    <p><span>row index: </span><span id="direct-idx">unknown</span></p>
    <button class="add-row" data-action="add-row" data-table="table-direct">Add row to direct</button>
    <table id="table-direct" class="table">
    <tbody>
        <tr>
            <td>normal</td>
            <td>normal</td>
            <td>normal</td>
        </tr>
        <tr>
            <td><p>nested</p></td>
            <td><p>nested</p></td>
            <td><p>nested</p></td>
        </tr>
        <tr>
            <td>normal</td>
            <td>normal</td>
            <td><p>nested</p></td>
        </tr>
        
    </tbody>
    </table>

    Here's the demo on jsFiddle.

    P.S:

    If you do have nested tables (or, in the general case, wish to delegate to elements with specific depth), you can use this suggestion from the jQuery bug report.

    0 讨论(0)
  • 2020-12-01 04:08

    This would get you the index of the clicked row, starting with one:

    $('#thetable').find('tr').click( function(){
    alert('You clicked row '+ ($(this).index()+1) );
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <table id="thetable">
       <tr>
          <td>1</td><td>1</td><td>1</td>
       </tr>
       <tr>
          <td>2</td><td>2</td><td>2</td>
       </tr>
       <tr>
          <td>3</td><td>3</td><td>3</td>
       </tr>
    </table>

    If you want to return the number stored in that first cell of each row:

    $('#thetable').find('tr').click( function(){
      var row = $(this).find('td:first').text();
      alert('You clicked ' + row);
    });
    
    0 讨论(0)
提交回复
热议问题