【问题标题】:how to make a whole row in a table clickable as a link?如何使表格中的整行可单击为链接?
【发布时间】:2013-06-13 10:11:35
【问题描述】:

我正在使用 Bootstrap,但以下不起作用:

<tbody>
    <a href="#">
        <tr>
            <td>Blah Blah</td>
            <td>1234567</td>
            <td>£158,000</td>
        </tr>
    </a>
</tbody>

【问题讨论】:

标签: html html-table bootstrap-4


【解决方案1】:

作者注一:

请看下面的其他答案,尤其是那些不使用 jquery 的答案。

作者注二:

为后代保留,但在 2020 年肯定是 错误 方法。(即使在 2017 年也不是惯用的)

原答案

您正在使用 Bootstrap,这意味着您正在使用 jQuery :^),因此一种方法是:

<tbody>
    <tr class='clickable-row' data-href='url://'>
        <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
    </tr>
</tbody>


jQuery(document).ready(function($) {
    $(".clickable-row").click(function() {
        window.location = $(this).data("href");
    });
});

当然,您不必使用 href 或切换位置,您可以在点击处理函数中做任何您喜欢的事情。阅读jQuery 以及如何编写处理程序;

使用 class 而不是 id 的优点是您可以将解决方案应用于多行:

<tbody>
    <tr class='clickable-row' data-href='url://link-for-first-row/'>
        <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
    </tr>
    <tr class='clickable-row' data-href='url://some-other-link/'>
        <td>More money</td> <td>1234567</td> <td>£800,000</td>
    </tr>
</tbody>

并且您的代码库不会改变。同一个处理程序会处理所有行。

另一种选择

您可以像这样使用 Bootstrap jQuery 回调(在 document.ready 回调中):

$("#container").on('click-row.bs.table', function (e, row, $element) {
    window.location = $element.data('href');
});

这样做的好处是在表格排序时不会被重置(其他选项会发生这种情况)。


注意

自从发布此内容后,window.document.location 已过时(或至少已弃用),请改用window.location

【讨论】:

  • 您可能还想使用 css 更改光标: tr.clickableRow { cursor: pointer; }
  • 只是想补充一点,您不应该在tr 上使用href 属性,因为它不是该元素的有效属性。改用数据属性:data-url="{linkurl}",在 js 代码中:$(this).data('url')
  • 您可以避免在每一行上使用一个类,并用类名clickable_row 装饰表格(CamelCase 违反 HTML 标准,应该小写(我在跨浏览器上遇到了一些问题)次))然后jQuery是$('.clickable_row tr').click(function ...但实际上你应该使用data-来保存数据,而不是href,因为这是自定义数据的规范。 data-url 和 jquery 将像 $(this).data(url); 一样访问它
  • 仅供参考:如果可以,您应该在 tr 中的某处为禁用 Javascript 的人留下一个链接。
  • 不是这个解决方案的忠实拥护者,因为用户在悬停时看不到浏览器底部的链接 URL,更重要的是无法通过滚轮单击链接以将其打开新标签。在每个单元格中插入带有display: block;a 标记有点烦人,但这似乎是解决此问题的最有用的方法。
【解决方案2】:

你不能那样做。它是无效的 HTML。您不能将&lt;a&gt; 放在&lt;tbody&gt;&lt;tr&gt; 之间。试试这个:

<tr onclick="window.location='#';">
   ...
</tr>

为指针视图添加样式

[data-href] { cursor: pointer; }

当你完成它时,你会想要使用 JavaScript 在 HTML 之外分配点击处理程序。

【讨论】:

  • @Aquillo OP 特别声明他/她正在使用引导程序。所以在框架内使用 jQuery 解决方案会更好
  • @AhmedMasud 在这种情况下,是的。尽管对于任何未来的读者来说,纯 JS 可能是一个更好的解决方案。既然这是 Stackoverflow 的目的,我仍然认为我的评论是有效的。
  • 行为和标记的分离当然是首选。如果有的话,我会说 href 不是 tr 上的有效属性。它应该替换为 data-href,并将 $(this).attr 替换为 $(this).data。
  • 或者你可以让“.clickableRow”类事件绑定方法在被点击的行中寻找第一个&lt;a&gt;。 (这也会优雅地降级)
  • 如果你使用 ES6 语法,你可以像这样执行链接点击:onClick={() =&gt; window.open('https://stackoverflow.com/', '_blank')}
【解决方案3】:

您可以在每个 &lt;td&gt; 中包含一个锚点,如下所示:

<tr>
  <td><a href="#">Blah Blah</a></td>
  <td><a href="#">1234567</a></td>
  <td><a href="#">more text</a></td>
</tr>

然后您可以在锚点上使用display:block; 以使整行可点击。

tr:hover { 
   background: red; 
}
td a { 
   display: block; 
   border: 1px solid black;
   padding: 16px; 
}

Example jsFiddle here.

除非您使用 JavaScript,否则这可能是您将获得的最佳效果。

【讨论】:

  • 这是最好的解决方案,没有 jquery 没有 javascript 只有 CSS,即我的链接可能不同而不是 href,有多个参数,如 所以我保留它并只更改样式。非常感谢。
  • @daniel 很好的答案,但如果单元格向下延伸,则无法像这样正常工作jsfiddle.net/RFFy9/253
  • 太棒了!如果用户愿意,此解决方案可以在新选项卡中打开链接。但空列不会有链接。
  • @AnnaRouben 我将不得不不同意:与优点相比,拥有多个相似的链接是一个非常小的缺点(没有 JS 的作品,屏幕阅读器可以阅读链接指向的位置,可以 ctrl -单击以在新选项卡中打开...)纯 HTML 解决方案在辅助软件中的工作几乎总是比 JS 解决方案更好。
  • 我喜欢这个解决方案,因为它易于访问。用户可以通过标签浏览链接,此外,您还可以在新标签中打开链接。我在我的应用程序中所做的是将tabindex="-1" 放在除第一个&lt;td&gt; 链接之外的所有链接上,因此用户选项卡逐行而不是单元格到单元格。此外,如果您想使用 :focus-within CSS 伪类,您仍然可以突出显示/勾勒整行。
【解决方案4】:

链接表行是可能的,但不能使用标准的&lt;table&gt; 元素。您可以使用display: table 样式属性来实现。 Herehere 是一些要演示的小提琴。

这段代码应该可以解决问题:

.table {
  display: table;
}

.row {
  display: table-row;
}

.cell {
  display: table-cell;
  padding: 10px;
}

.row:hover {
  background-color: #cccccc;
}

.cell:hover {
  background-color: #e5e5e5;
}
<link href="https://stackpath.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" type="text/css" />

<div role="grid" class="table">
  <div role="row" class="row">
    <div role="gridcell" class="cell">
      1.1
    </div>
    <div role="gridcell" class="cell">
      1.2
    </div>
    <div role="gridcell" class="cell">
      1.3
    </div>
  </div>

  <a role="row" class="row" href="#">
    <div role="gridcell" class="cell">
      2.1
    </div>
    <div role="gridcell" class="cell">
      2.2
    </div>
    <div role="gridcell" class="cell">
      2.3
    </div>
  </a>
</div>

请注意,由于不使用标准 &lt;table&gt; 元素,因此需要 ARIA 角色以确保正确的可访问性。如果适用,您可能需要添加其他角色,例如 role="columnheader"Find out more at the guide here.

【讨论】:

  • 现在尝试将dataTables插件应用到这个! :)
  • 这是正确的答案恕我直言,因为它保留了与链接相关的所有用户代理工具:搜索(例如,Firefox 中的/ 键)、导航(tab 键)、复制链接位置、即使对于可访问/特殊需要的浏览器,也可以在新选项卡/窗口等中打开。我唯一的挑剔是我不会在&lt;a&gt; 中嵌套&lt;div&gt;,因此单元格最好标记为&lt;span&gt;
  • 将第三方插件和库应用于此类 CSS 表可能需要更多工作,但通常是复制粘贴和替换。例如,我只是复制了 Bootstrap 自己的 _tables.scss 和其他一些随机部分,将所有出现的表格元素替换为我选择使用的 CSS 类(与元素相同:th.th)与收益相比,工作量并不大。
  • 不错的答案,但这只是表仅用于正确对齐的解决方案(在许多情况下都是这种情况!)。对于表格数据,语义&lt;table&gt; 的存在是有原因的。但这仍然胜过任何 javascript 解决方案:)
  • 虽然这是一个非常聪明的解决方法,但就是这样。它实际上不是一个表格,因此正如作者所提到的,它会给可访问性带来问题。这很可能会导致其他需要一张桌子但正在获得一张桌子的东西出现问题。
【解决方案5】:

使用标准 Bootstrap 4.3+ 实现如下 - 不需要 jQuery 也不需要任何额外的 css 类!

关键是在单元格内的文本上使用stretched-link,并将&lt;tr&gt;定义为包含块。

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"/>

<table class="table table-hover">
  <tbody>
    <tr style="transform: rotate(0);">
    <th scope="row"><a href="#" class="stretched-link">1</a></th>
      <td>Mark</td>
      <td>Otto</td>
      <td>@mdo</td>
    </tr>
    <tr>
      <th scope="row">2</th>
      <td>Jacob</td>
      <td>Thornton</td>
      <td>@fat</td>
    </tr>
    <tr>
      <th scope="row">3</th>
      <td>Larry</td>
      <td>the Bird</td>
      <td>@twitter</td>
    </tr>
  </tbody>
</table>

您可以通过不同的方式定义包含块,例如将transform 设置为非无值(如上例所示)。

如需了解更多信息,请阅读此处的 Bootstrap documentation stretched-link

【讨论】:

  • 这个答案值得更多投票。根本没有javascript。那scope="row" 是干什么用的?我不使用范围,该行仍然充当链接。
  • 这样做的缺点是因为链接将在列的顶部,您无法复制文本,并且如果鼠标悬停在 td 中的属性标题不显示。所以不幸的是,我不得不回到旧的方式,只把链接放在一列。
  • 我喜欢这个解决方案,但遗憾的是,它不是跨浏览器(Chrome/Firefox 可以,但 Safari 不行)。问题是由于tr标签未被识别为浏览器中包含块的规则...stackoverflow.com/questions/61342248/…
  • 是的,这似乎确实破坏了 Safari 中的表格链接——悬停行为完全失控。 This comment on #28608 似乎表明使用 stretched-link 的表无法获得所需的行为。
  • 这似乎不起作用(Firefox 78.7.0、Chrome 89.0.4389.114),所有行都指向最后一行的相同 href
【解决方案6】:

一个更灵活的解决方案是使用 data-href 属性来定位任何东西。这是您可以在不同的地方轻松重用代码。

<tbody>
    <tr data-href="https://google.com">
        <td>Col 1</td>
        <td>Col 2</td>
    </tr>
</tbody>

然后在你的 jQuery 中只定位具有该属性的任何元素:

jQuery(document).ready(function($) {
    $('*[data-href]').on('click', function() {
        window.location = $(this).data("href");
    });
});

别忘了给你的 CSS 设置样式:

[data-href] {
    cursor: pointer;
}

现在您可以将 data-href 属性添加到任何元素,它会起作用。当我像这样编写 sn-ps 时,我喜欢它们灵活。如果你有,请随意添加一个香草 js 解决方案。

【讨论】:

  • css 做得很好
【解决方案7】:

前面没有提到的一种解决方案是在单元格中使用单个链接,并使用一些 CSS 将该链接扩展到单元格:

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>

【讨论】:

  • 这看起来相当优雅。但是谷歌链接演示不起作用。 Stackoverflow 可以。可能只是谷歌像往常一样是驴子。也许链接到 Bing :-) 为他们服务。无论如何,v 漂亮整洁的解决方案。
  • 这对我有用!!很好的解决方案。需要注意的一点是 a:before 的宽度必须足够长以覆盖整个表格。
  • 很好,但我的桌子没有固定宽度。所以我只是把锚定得很宽——4000px。瞧!
  • @BrettDonald 您可以使用 100vh 作为宽度,因此它与视口的宽度相同 :)
  • 谢谢@passatgt,上周我也得出了同样的结论。 4000px 有一些不需要的副作用,但 100vw(不是 100vh)效果很好。
【解决方案8】:

这里是简单的解决方案..

<tr style='cursor: pointer; cursor: hand;' onclick="window.location='google.com';"></tr>

【讨论】:

    【解决方案9】:

    你可以使用这个引导组件:

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

    Jasny 引导

    您最喜欢的前端框架缺少的组件。

    <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>
    

    用法

    通过数据属性

    .rowlink 类和data-link="row" 属性添加到&lt;table&gt;&lt;tbody&gt; 元素。对于其他选项,将名称附加到 data-,如 data-target="a.mainlink" 可以通过将 .rowlink-skip 类添加到 &lt;td&gt; 来排除单元格。

    通过 JavaScript

    通过javascript调用输入掩码:

    $('tbody.rowlink').rowlink()
    

    【讨论】:

      【解决方案10】:

      您可以将按钮角色添加到表格行,Bootstrap 将更改光标而无需任何 css 更改。我决定使用这个角色,用很少的代码轻松地使任何行都可以点击。

      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");
           });
      });
      

      您可以应用相同的原理将按钮角色添加到任何标签。

      【讨论】:

      • 哇,它实际上使用 ui-sref 而不是 data-href 而不使用 jquery 代码。只需将光标更改为手指即可。
      【解决方案11】:

      从技术上讲,有一种很好的方法可以在&lt;tr&gt; 中使用&lt;a&gt; 标记,这可能在语义上不正确(可能会给您一个浏览器警告),但不需要JavaScript/jQuery 也可以工作:

      <!-- HTML -->
      <tbody>
        <tr class="bs-table-row">
           <td>Blah Blah</td>
           <td>1234567</td>
           <td>£158,000</td>
           <a class="bs-row-link" href="/your-link-here"></a>
        </tr>
      </tbody>
      
      /* CSS */
      .bs-table-row {
        position: 'relative';
      }
      
      .bs-row-link {
        position: 'absolute';
        left: 0;
        height: '36px'; // or different row height based on your requirements
        width: '100%';
        cursor: 'pointer';
      }
      

      PS:注意这里的技巧是将&lt;a&gt;标签作为最后一个元素,否则它会尝试占用第一个&lt;td&gt;单元格的空间。

      PPS:现在您的整行都可以点击了,您也可以使用此链接在新标签页中打开(Ctrl/CMD+点击)

      【讨论】:

      • 这不是和my answer基本一样吗?
      • 虽然这个答案看起来很完美,但实际上并没有用,因为 &lt;tr&gt; 元素不能有 &lt;a&gt; 元素作为子元素。只有 &lt;td&gt;&lt;th&gt; 是有效的子代。见:stackoverflow.com/questions/12634715/…
      【解决方案12】:

      在我看来,一个非常简单的选择就是使用点击,而且更正确,因为这将视图和控制器分开,您无需对 URL 进行硬编码或您需要完成的任何其他操作点击。 它也适用于 Angular ng-click。

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

      示例工作here

      【讨论】:

      • 这当然是正确的答案。对于这么简单的事情,其他人都非常复杂。如果要更改鼠标指针,可以添加 tr:hover { cursor: pointer; } 到你的 CSS 类
      • @TomClose 根据您希望行单击执行的操作,这可能会出现问题,例如导航无法正常工作 - 在新选项卡/窗口中打开时无需单击切换,无需悬停即可查看目的地等。
      【解决方案13】:

      您可以在 tr 中使用 onclick javascript 方法并使其可点击,如果您由于某些细节需要构建链接,您可以在 javascript 中声明一个函数并在 onclick 中调用它,并传递一些值。

      【讨论】:

        【解决方案14】:

        这是一种在表格行上放置透明 A 元素的方法。优点是:

        • 是一个真正的链接元素:悬停改变指针,在状态栏中显示目标链接,可以键盘导航,可以在新标签或窗口中打开,可以复制 URL 等
        • 表格看起来与未添加链接时相同
        • 表格代码本身没有变化

        缺点:

        • 必须在脚本中设置 A 元素的大小,无论是在创建时还是在其覆盖的行大小发生任何更改之后(否则它可以在根本没有 JavaScript 的情况下完成,如果表大小仍然可以也是在 HTML 或 CSS 中设置的)

        表格保持原样:

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

        通过 jQuery JavaScript 添加链接(为每一行),方法是在第一列中插入一个 A 元素并设置所需的属性:

        // 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)
                ;
            });
        

        如果使用了许多填充和边距,宽度和高度设置可能会很棘手,但一般来说,偏离几个像素甚至都无关紧要。

        现场演示:http://jsfiddle.net/qo0dx0oo/(适用于 Firefox,但不适用于 IE 或 Chrome,链接位置错误)

        已针对 Chrome 和 IE 修复(在 FF 中仍然有效):http://jsfiddle.net/qo0dx0oo/2/

        【讨论】:

        • 聪明的解决方案。我发现创建元素是懒惰的,只有当行悬停时,才能为大表带来巨大的性能提升。
        • @levi 你能提供一些关于如何延迟加载的反馈吗?
        • @KemalEmin 我假设他会使用 javascript 的 onmouseover
        【解决方案15】:

        下面的代码将使您的整个表格可点击。单击此示例中的链接将在警报对话框中显示该链接,而不是跟随该链接。

        HTML:

        这是上面示例背后的 HTML:

            <table id="example">
            <tr>
             <th>&nbsp;</th>
             <th>Name</th>
             <th>Description</th>
             <th>Price</th>
           </tr>
           <tr>
             <td><a href="apples">Edit</a></td>
             <td>Apples</td>
             <td>Blah blah blah blah</td>
             <td>10.23</td>
           </tr>
            <tr>
             <td><a href="bananas">Edit</a></td>
             <td>Bananas</td>
             <td>Blah blah blah blah</td>
             <td>11.45</td>
           </tr>
           <tr>
             <td><a href="oranges">Edit</a></td>
             <td>Oranges</td>
             <td>Blah blah blah blah</td>
             <td>12.56</td>
           </tr>
            </table>
        

        CSS

        还有 CSS:

            table#example {
            border-collapse: collapse;   
        }
        #example tr {
            background-color: #eee;
            border-top: 1px solid #fff;
        }
        #example tr:hover {
            background-color: #ccc;
        }
        #example th {
            background-color: #fff;
        }
        #example th, #example td {
            padding: 3px 5px;
        }
        #example td:hover {
            cursor: pointer;
        }
        

        jQuery

        最后是让奇迹发生的 jQuery:

            $(document).ready(function() {
        
            $('#example tr').click(function() {
                var href = $(this).find("a").attr("href");
                if(href) {
                    window.location = href;
                }
            });
        
        });
        

        当点击一行时,它会搜索属于锚点的 href。如果找到,则窗口的位置将设置为该 href。

        【讨论】:

          【解决方案16】:

          我知道有人已经写了几乎相同的内容,但是我的方式是正确的方式(div 不能是 A 的子级),而且最好使用类。

          您可以使用 CSS 模拟表格并将 A 元素设为行

          <div class="table" style="width:100%;">
            <a href="#" class="tr">
              <span class="td">
                cell 1
              </span>
              <span class="td">
                cell 2
              </span>
            </a>
          </div>
          

          css:

          .table{display:table;}
          .tr{display:table-row;}
          .td{display:table-cell;}
          .tr:hover{background-color:#ccc;}
          

          【讨论】:

            【解决方案17】:

            这里有一篇文章解释了如何在 2020 年做到这一点:https://www.robertcooper.me/table-row-links

            文章解释了 3 种可能的解决方案:

            1. 使用 JavaScript。
            2. 用锚元素包裹所有表格单元格。
            3. 使用 &lt;div&gt; 元素代替原生 HTML 表格元素,以便将表格行作为 &lt;a&gt; 元素。

            本文深入探讨了如何实现每个解决方案(带有指向 CodePens 的链接)并考虑了边缘情况,例如如何处理要在表格单元格中添加链接的情况(具有嵌套的 &lt;a&gt; 元素不是有效的 HTML,因此您需要解决此问题)。

            正如@gameliela 所指出的,可能还值得尝试找到一种方法,不要将整行都设为链接,因为它会简化很多事情。但是,我确实认为,将整个表格行作为链接单击会是一种很好的用户体验,因为用户可以方便地单击表格上的任意位置以导航到相应的页面。

            【讨论】:

              【解决方案18】:

              另一个选项使用&lt;a&gt;、CSS 位置和一些 jQuery 或 JS

              HTML:

              <table>
              <tr>
                  <td>
                      <span>1</span>
                      <a href="#" class="rowLink"></a>
                  </td>
                  <td><span>2</span></td>
              </tr>
              </table>
              

              CSS:

              table tr td:first-child {
                  position: relative;
              }
              a.rowLink {
                  position: absolute;
                  top: 0; left: 0;
                  height: 30px;
              }
              a.rowLink:hover {
                  background-color: #0679a6;
                  opacity: 0.1;
              }
              

              然后你需要给一个宽度,例如使用 jQuery:

                  $(function () {
                      var $table = $('table');
                          $links = $table.find('a.rowLink');
              
                      $(window).resize(function () {
                          $links.width($table.width());
                      });
              
                      $(window).trigger('resize');
                  });
              

              【讨论】:

                【解决方案19】:

                接受的答案很好,但如果您不想在每个 tr 上重复 url,我建议一个小的替代方案。 因此,您将 url 或 href 放在表 data-url 而不是 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);
                    });
                });
                

                这也很好,因为您也不需要为每个 tr 添加点击数据属性。另一个好处是我们没有使用类来触发点击,因为类应该只用于样式。

                【讨论】:

                  【解决方案20】:

                  我更喜欢使用onclick="" 属性,因为它对于新手来说易于使用和理解

                   <tr onclick="window.location='any-page.php'">
                      <td>UserName</td>
                      <td>Email</td>
                      <td>Address</td>
                  </tr>
                  

                  【讨论】:

                    【解决方案21】:
                    <tbody>
                        <tr data-href='www.bbc.co.uk'>
                            <td>Blah Blah</td>
                            <td>1234567</td>
                            <td>£158,000</td>
                        </tr>
                        <tr data-href='www.google.com'>
                            <td>Blah Blah</td>
                            <td>1234567</td>
                            <td>£158,000</td>
                        </tr>
                    </tbody>
                    
                    <script>
                        jQuery(document).ready(function ($) {
                            $('[data-href]').click(function () {
                                window.location = $(this).data("href");
                            });
                        });
                    </script>
                    

                    虽然这里的主要解决方案很棒,但我的解决方案消除了对类的需求。您需要做的就是添加带有 URL 的 data-href 属性。

                    【讨论】:

                      【解决方案22】:

                      我已经投入了大量时间来解决这个问题。

                      有3种方法:

                      1. 使用 JavaScript。明显的缺点:无法在本地打开新选项卡,并且当将鼠标悬停在行上时,状态栏上不会像常规链接那样显示任何指示。可访问性也是一个问题。

                      2. 仅使用 HTML/CSS。这意味着将&lt;a&gt; 嵌套在每个&lt;td&gt; 下。像this fiddle 这样的简单方法不起作用 - 因为可点击表面 不一定对每一列都相等。这是一个严重的用户体验问题。此外,如果您需要在行上添加 &lt;button&gt;,则将其嵌套在 &lt;a&gt; 标记下是无效的 HTML(尽管浏览器可以这样做)。

                        我发现了 3 种其他方法来实现这种方法。第一个还可以,其他两个不太好。

                        a) 看看this example:

                        tr {
                          height: 0;
                        }
                        
                        td {
                          height: 0;
                          padding: 0;
                        }
                        
                        /* A hack to overcome differences between Chrome and Firefox */
                        @-moz-document url-prefix() {
                          td {
                            height: 100%;
                          }
                        }
                        
                        a {
                          display: block;
                          height: 100%;
                        }
                        

                        它可以工作,但由于 Chrome 和 Firefox 之间的不一致,它需要特定于浏览器的 hack 来克服差异。此外,Chrome 将始终将单元格内容与顶部对齐,这可能会导致长文本出现问题,尤其是在涉及不同行高的情况下。

                        b) 将&lt;td&gt; 设置为{ display: contents; }。这会导致另外两个问题:

                        b1。如果其他人尝试直接设置&lt;td&gt; 标签的样式,比如将其设置为{ width: 20px; },我们需要以某种方式将该样式传递给&lt;a&gt; 标签。我们需要一些魔法来做到这一点,可能比 Javascript 替代方案更神奇。

                        b2。 { display: contents; } 仍处于试验阶段;特别是 Edge 不支持它。

                        c) 将&lt;td&gt; 设置为{ height: --some-fixed-value; }。这只是不够灵活。

                      3. 我建议认真考虑的最后一种方法根本不使用可点击的行。可点击的行并不是很好的 UX 体验:视觉上将它们标记为可点击并不容易,而且当行内的多个部分(如按钮)可点击时,这会带来挑战。因此,一个可行的替代方案可能是仅在第一列上使用&lt;a&gt; 标记,显示为常规链接,并赋予其导航整行的作用。

                      【讨论】:

                        【解决方案23】:

                        这是另一种方式...

                        HTML:

                        <table>
                        <tbody>
                               <tr class='clickableRow'>
                               <td>Blah Blah</td>
                               <td>1234567</td>
                               <td>£158,000</td>
                                </tr>
                        </tbody>
                        </table>
                        

                        jQuery:

                        $(function() {
                              $(".clickableRow").on("click", function() {
                                  location.href="http://google.com";
                        
                              });
                        
                        });
                        

                        【讨论】:

                        • 如何在新标签页中打开它? @klewis
                        【解决方案24】:
                        <table>
                          <tr tabindex="0" onmousedown="window.location='#';">
                            <td>1</td>
                            <td>2</td>
                            <td>3</td>
                          </tr>
                        </table>
                        

                        将 # 替换为 url,tabindex="0" 使任何元素都可聚焦

                        【讨论】:

                        【解决方案25】:

                        你可以给行一个 id,例如

                        &lt;tr id="special"&gt; ... &lt;/tr&gt;

                        然后使用 jquery 说类似的话:

                        $('#special').onclick(function(){ window="http://urltolinkto.com/x/y/z";})

                        【讨论】:

                        • 我相信你想使用 class 而不是 id 因为你很可能会有多行并且 id 应该只用于一项。
                        【解决方案26】:

                        为什么我们不应该使用“div”标签......

                        <div>
                        
                          <a href="" >     <div>  Table row  of content here..  </div>    </a>
                        
                        </div>
                        

                        【讨论】:

                        • 你应该用 css display:table 改进你的答案
                        • 通过添加 css 改进答案
                        猜你喜欢
                        • 1970-01-01
                        • 2020-11-03
                        • 1970-01-01
                        • 1970-01-01
                        • 2016-05-11
                        相关资源
                        最近更新 更多