how to make a whole row in a table clickable as a link?

前端 未结 26 1591
粉色の甜心
粉色の甜心 2020-11-22 14:05

I\'m using Bootstrap and the following doesn\'t work:


    
        
            Blah Blah
           


        
相关标签:
26条回答
  • 2020-11-22 14:17

    The accepted answer is great, but I propose a small alternative if you don't want to repeat the url on every tr. So you put the url or href in the table data-url and not the tr.

    <table data-click data-url="href://blah">    
        <tbody>
            <tr id ="2">
                <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
            </tr>
            <tr id ="3">
                <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
            </tr>
        </tbody>
        </table
    
    jQuery(document).ready(function($) {
        $('[data-click] tbody tr').click(function() {
            var url = $(this).closest('table').data("url");
            var id = $(this).closest('tr').attr('id');
            window.location = url+"?id="+id);
        });
    });
    

    This is also good because you don't need to add the click data attribute to every tr either. The other good thing is that we are not using a class to trigger a click as classes should only really be used for styling.

    0 讨论(0)
  • 2020-11-22 14:18

    One solution that was not mentioned earlier is to use a single link in a cell and some CSS to extend this link over the cells:

    table {
      border: 1px solid;
      width: 400px;
      overflow: hidden;
    }
    
    tr:hover {
      background: gray;
    }
    
    tr td {
      border: 1px solid;
    }
    
    tr td:first-child {
      position:relative;
    }
    
    a:before {
      content: '';
      position:absolute;
      left: 0;
      top: 0;
      bottom: 0;
      display: block;
      width: 400px;
    }
    <table>
      <tr>
        <td><a href="https://google.com">First column</a></td>
        <td>Second column</td>
        <td>Third column</td>
      </tr>
      <tr>
        <td><a href="https://stackoverflow.com">First column</a></td>
        <td>Second column</td>
        <td>Third column</td>
      </tr>
    </table>

    0 讨论(0)
  • 2020-11-22 14:20

    You can use this bootstrap component:

    http://jasny.github.io/bootstrap/javascript/#rowlink

    Jasny Bootstrap

    The missing components for your favorite front-end framework.

    <table class="table table-striped table-bordered table-hover">
      <thead>
        <tr><th>Name</th><th>Description</th><th>Actions</th></tr>
      </thead>
      <tbody data-link="row" class="rowlink">
        <tr><td><a href="#inputmask">Input mask</a></td><td>Input masks can be used to force the user to enter data conform a specific format.</td><td class="rowlink-skip"><a href="#">Action</a></td></tr>
        <tr><td><a href="http://www.jasny.net/" target="_blank">jasny.net</a></td><td>Shared knowledge of Arnold Daniels aka Jasny.</td><td class="rowlink-skip"><a href="#">Action</a></td></tr>
        <tr><td><a href="#rowlinkModal" data-toggle="modal">Launch modal</a></td><td>Toggle a modal via JavaScript by clicking this row.</td><td class="rowlink-skip"><a href="#">Action</a></td></tr>
      </tbody>
    </table>
    

    Usage

    Via data attributes

    Add class .rowlink and attribute data-link="row" to a <table> or <tbody> element. For other options append the name to data-, as in data-target="a.mainlink" A cell can be excluded by adding the .rowlink-skip class to the <td>.

    Via JavaScript

    Call the input mask via javascript:

    $('tbody.rowlink').rowlink()
    
    0 讨论(0)
  • 2020-11-22 14:20

    Here is a way by putting a transparent A element over the table rows. Advantages are:

    • is a real link element: on hover changes pointer, shows target link in status bar, can be keyboard navigated, can be opened in new tab or window, the URL can be copied, etc
    • the table looks the same as without the link added
    • no changes in table code itself

    Disadvantages:

    • size of the A element must be set in a script, both on creation and after any changes to the size of the row it covers (otherwise it could be done with no JavaScript at all, which is still possible if the table size is also set in HTML or CSS)

    The table stays as is:

    <table id="tab1">
    <tbody>
            <tr>
                <td>Blah Blah</td>
                <td>1234567</td>
                <td>£158,000</td>
            </tr>
    </tbody>
    </table>
    

    Add the links (for each row) via jQuery JavaScript by inserting an A element into each first column and setting the needed properties:

    // v1, fixed for IE and Chrome
    // v0, worked on Firefox only
    // width needed for adjusting the width of the A element
    var mywidth=$('#tab1').width();
    
    $('#tab1 tbody>tr>td:nth-child(1)').each(function(index){
        $(this).css('position',  'relative');// debug: .css('background-color', '#f11');
        // insert the <A> element
        var myA=$('<A>');
        $(this).append(myA);
        var myheight=$(this).height();
    
        myA.css({//"border":'1px solid #2dd', border for debug only
                'display': 'block',
                'left': '0',
                'top': '0',
                'position':  'absolute'
            })
            .attr('href','the link here')
            .width(mywidth)
            .height(myheight)
            ;
        });
    

    The width and height setting can be tricky, if many paddings and margins are used, but in general a few pixels off should not even matter.

    Live demo here: http://jsfiddle.net/qo0dx0oo/ (works in Firefox, but not IE or Chrome, there the link is positioned wrong)

    Fixed for Chrome and IE (still works in FF too): http://jsfiddle.net/qo0dx0oo/2/

    0 讨论(0)
  • 2020-11-22 14:21

    You can add the button role to a table row and Bootstrap will change the cursor without any css changes. I decided to use that role as a way to easily make any row clickable with very little code.

    Html

    <table class="table table-striped table-hover">
         <tbody>
              <tr role="button" data-href="#">
                   <td>Cell 1</td>
                   <td>Cell 2</td>
                   <td>Cell 3</td>
              </tr>
         </tbody>
    </table>
    

    jQuery

    $(function(){
         $(".table").on("click", "tr[role=\"button\"]", function (e) {
              window.location = $(this).data("href");
         });
    });
    

    You can apply this same principle to add the button role to any tag.

    0 讨论(0)
  • 2020-11-22 14:21

    A very easy option is just use on-click, and more correct, in my point of view, because this separate the view and controller, and you don't need to hard code the URL or whatever more you need do accomplish with the click. It works with Angular ng-click too.

    <table>
      <tr onclick="myFunction(this)">
        <td>Click to show rowIndex</td>
      </tr>
    </table>
    
    <script>
    function myFunction(x) {
        alert("Row index is: " + x.rowIndex);
    }
    </script>
    

    Exemple working here

    0 讨论(0)
提交回复
热议问题