如何将表中的整行作为链接点击?

use*_*814 402 html html-table bootstrap-4

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

<tbody>
    <a href="#">
        <tr>
            <td>Blah Blah</td>
            <td>1234567</td>
            <td>£158,000</td>
        </tr>
    </a>
</tbody>
Run Code Online (Sandbox Code Playgroud)

Ahm*_*sud 542

你正在使用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");
    });
});
Run Code Online (Sandbox Code Playgroud)

当然,您不必使用href或switch位置,您可以在单击处理函数中执行任何您喜欢的操作.阅读jQuery以及如何编写处理程序;

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

<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>
Run Code Online (Sandbox Code Playgroud)

并且您的代码库不会更改.相同的处理程序将处理所有行.

另外一个选项

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

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

这样做的好处是不会在表排序时重置(这与其他选项一起发生).


注意

由于发布的window.document.location内容已过时(或至少已弃用),请window.location改为使用.

  • 您可能还想使用css更改光标:tr.clickableRow {cursor:pointer; } (99认同)
  • 只是想补充一点,你不应该在`tr`上使用`href`属性,因为它不是这个元素的有效属性.使用数据属性:`data-url ="{linkurl}"`和js代码:`$(this).data('url')` (78认同)
  • 不是这个解决方案的忠实粉丝,因为用户在悬停时看不到浏览器底部的链接URL,更重要的是无法在链接上点击链接以在新选项卡中打开它.在每个单元格中插入带有`display:block;`的`a`标签有点烦人,但它似乎是解决这个问题最有用的方法. (45认同)
  • 你可以避免在每一行上使用一个类,并使用类名称`clickable_row`来装饰表(CamelCase是针对HTML标准的,应该是小写的(我用交叉浏览器有几次问题))然后jQuery是`$('.clickable_row tr').click(function ...`但实际上你应该使用`data -`来保存数据,而不是`href`,因为这是自定义数据的规范. url`和jquery将像`$(this).data(url);`一样访问它 (11认同)
  • 仅供参考:如果可以的话,您应该在tr中的某个地方为已禁用Javascript的人留下链接. (3认同)
  • [这是一个只需要HTML和CSS的解决方案.](http://stackoverflow.com/a/23120665/2463800)希望这会有所帮助. (2认同)
  • @IvoPereira为了避免在今天的世界中使用javascript而避免使用javascript是很奇怪的.任何选择为了"安全"而关闭javascript的人也会选择失去功能.没有必要迎合他们. (2认同)
  • 您不能使用任何现代浏览器的默认配置更改“ window.status”。而且,在我看来,“可点击作为链接”不仅指“左可点击可点击”。不得不捕获已经为超链接标记实现的所有事件也很令人失望。在纸上看起来很有希望(因为:干净的html),但是最后我看到了太多的弊端,因此不考虑在每个表单元格中不使用`&lt;a&gt;`标签,或者像您建议的那样根本不使用表(这是对于实际的表格数据也非常令人沮丧)。 (2认同)
  • 不要忘记在`tr`上添加属性`tabindex =“ 0”`以使行可聚焦。这对可访问性很重要。 (2认同)
  • 作者的注释肯定是有用的,但最好只是简单地在那里放置一个现代方法(并将旧答案保留在其下面以供后代使用) (2认同)

dav*_*ber 203

你不能这样做.它是无效的HTML.你不能把它<a>放在a <tbody>和a 之间<tr>.试试这个:

<tr onclick="window.location='#';">
   ...
</tr>
Run Code Online (Sandbox Code Playgroud)

当您开始使用它时,您希望使用JavaScript在HTML之外分配单击处理程序.

  • @AhmedMasud在这种情况下,是的.虽然对于任何未来的读者来说,普通JS可能是更好的解决方 由于这是Stackoverflow的目的,我仍然认为我的评论是有效的. (36认同)
  • @Aquillo OP明确表示他/她正在使用bootstrap.所以jQuery解决方案在框架内会更好 (3认同)
  • 行为和标记的分离当然是首选.如果有的话,我会说href不是tr上的有效属性.它应该用data-href替换,并用$(this).data替换$(this).attr. (3认同)
  • 如果您使用的是ES6语法,则可以像这样执行链接单击:`onClick = {()=&gt; window.open('https://stackoverflow.com/','_blank')}' (3认同)
  • 或者,您可以使“.clickableRow”类事件绑定方法查找单击的行内的第一个“&lt;a&gt;”。(这也会优雅地降级) (2认同)
  • 不幸的是,这个解决方案破坏了“中键单击以在新选项卡中打开链接”。onclick 仅适用于左键单击,并且我不知道有任何方法可以更改它以在新选项卡中打开中键单击。 (2认同)

dsg*_*fin 168

您可以在每个内部包含一个锚点<td>,如下所示:

<tr>
  <td><a href="#">Blah Blah</a></td>
  <td><a href="#">1234567</a></td>
  <td><a href="#">more text</a></td>
</tr>
Run Code Online (Sandbox Code Playgroud)

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

tr:hover { 
   background: red; 
}
td a { 
   display: block; 
   border: 1px solid black;
   padding: 16px; 
}
Run Code Online (Sandbox Code Playgroud)

示例jsFiddle这里.

除非你使用JavaScript,否则这可能就像你要获得它一样最佳.

  • 这是最好的解决方案,没有jquery没有javascript只有CSS,即我的链接可能不同而不是href,有多个参数,如<a4j:commandLink />所以我保留它并只更改样式.非常感谢. (10认同)
  • @AnnaRouben我将不得不反对:拥有多个类似的链接是一个非常小的缺点相比上部(没有JS的工作,屏幕阅读器可以读取链接所在的位置,可以按住Ctrl键单击以在新选项卡中打开. ..)纯HTML解决方案在辅助软件中的工作几乎总是比JS解决方案更好. (7认同)
  • 我喜欢这种解决方案,因为它的可访问性很强。用户可以浏览链接,也可以在新标签中打开链接。我在应用程序中完成的操作是在第一个&lt;td&gt;链接之外的所有链接上都添加了tabindex =“-1”,因此用户逐行制表,而不是逐个单元格制表。另外,如果要使用CSS伪类`:focus-within`,您仍然可以突出显示/概述整个行。 (5认同)
  • @daniel很好的答案,但如果细胞向下延伸,不能像这样http://jsfiddle.net/RFFy9/253/正常工作 (4认同)
  • 大!如果用户需要,此解决方案可以在新选项卡中打开链接.但空列不会有链接. (4认同)
  • 该解决方案的缺点是它的可访问性并不理想。您有多个彼此相邻的链接前往同一个地方。 (2认同)
  • 我将继续使用此解决方案。我讨厌 javascript 解决方案,因为它们使这些链接无法作为浏览器中的普通链接运行。对此,javascript 解决方案的流行程度让我感到震惊。 (2认同)

Tre*_*ery 87

是的,但没有标准<table>元素.如果使用display: table样式属性,则可以.这里这里有一些小小的展示.

这段代码可以解决这个问题:

.table {
  display: table;
}

.row {
  display: table-row;
}

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

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

.cell:hover {
  background-color: #e5e5e5;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

请注意,由于<table>未使用标准元素,因此使用aria角色来确保正确的可访问性.您可能需要添加其他角色(role="columnheader"如果适用).请在以下指南中了解更多信息.

  • 现在尝试将dataTables插件应用到这个!:) (11认同)
  • 这是正确答案恕我直言,因为它保留了与链接相关的所有用户代理工具:搜索(例如Firefox中的`/`键),导航(`tab`键),复制链接位置,在新标签/窗口中打开等甚至是可访问/特殊需求的浏览器.我唯一的挑剔是我不会在`<a>>中嵌入一个`<div>`,所以这些单元格会更好地标记为`<span>`. (7认同)
  • 很好的答案,但这只是一个解决方案,如果表只是用于正确的对齐(在许多情况下就是这种情况!).对于表格数据,语义"<table>"是有原因的.但这仍然胜过任何JavaScript解决方案:) (2认同)

Abd*_*afa 13

更灵活的解决方案是使用data-href属性定位任何内容.这是您可以在不同的地方轻松重用代码.

<tbody>
    <tr data-href="https://google.com">
        <td>Col 1</td>
        <td>Col 2</td>
    </tr>
</tbody>
Run Code Online (Sandbox Code Playgroud)

然后在你的jQuery中,只需使用该属性定位任何元素:

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

别忘了给你的css打造一个风格:

[data-href] {
    cursor: pointer;
}
Run Code Online (Sandbox Code Playgroud)

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


pas*_*tgt 8

前面没有提到的一种解决方案是在单元格中使用单个链接,并使用一些 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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@passatgt,我上周得出了同样的结论。4000px 有一些不需要的副作用,但 100vw(不是 100vh)效果很好。 (2认同)

Tod*_*ton 7

您可以将按钮角色添加到表格行,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>
Run Code Online (Sandbox Code Playgroud)

jQuery

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

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


Mur*_*rad 7

这是简单的解决方案..

<tr style='cursor: pointer; cursor: hand;' onclick="window.location='google.com';"></tr>
Run Code Online (Sandbox Code Playgroud)


phl*_*egx 6

您可以使用此引导程序组件:

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

Jasny Bootstrap

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

<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>
Run Code Online (Sandbox Code Playgroud)

用法

通过数据属性

将类.rowlink和属性添加data-link="row"到元素<table><tbody>元素.对于其他选项,将名称附加到data-,因为data-target="a.mainlink"可以通过将.rowlink-skip类添加到A来排除<td>.

通过JavaScript

通过javascript调用输入掩码:

$('tbody.rowlink').rowlink()
Run Code Online (Sandbox Code Playgroud)


Ron*_*nen 6

有一个很好的方法从技术上做<a>标记内部<tr>,这可能在语义上不正确(可能会给你一个浏览器警告),但没有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';
}
Run Code Online (Sandbox Code Playgroud)

PS:注意这里的技巧是将<a>tag作为最后一个元素,否则它将尝试占用第一个<td>单元格的空间.

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


Wen*_*ira 6

一个非常简单的选择是使用点击,在我看来更正确,因为这将视图和控制器分开,并且您不需要硬编码 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>
Run Code Online (Sandbox Code Playgroud)

这里工作的例子

  • @TomClose 根据您希望行单击执行的操作,这可能会出现问题,因为例如导航无法正常工作 - 没有在新选项卡/窗口中打开的Shift单击,没有悬停来查看目的地等。 (3认同)

Ana*_*yan 5

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


Dav*_*žic 5

这是通过在表行上放置透明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>
Run Code Online (Sandbox Code Playgroud)

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

// 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)
        ;
    });
Run Code Online (Sandbox Code Playgroud)

如果使用许多填充和边距,则宽度和高度设置可能会比较棘手,但通常,关闭几个像素甚至都不会造成影响。

此处的现场演示:http : //jsfiddle.net/qo0dx0oo/(在Firefox中有效,但在IE或Chrome中不起作用,该链接的位置错误)

已修复,适用于Chrome和IE(在FF中也同样适用):http : //jsfiddle.net/qo0dx0oo/2/

  • 聪明的解决方案。我发现懒惰地创建元素,只有将鼠标悬停在行上时,才能为大表带来巨大的性能提升。 (2认同)

Sid*_*pac 5

我知道有人已经写了几乎相同的内容,但是我的方法是正确的方法(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>
Run Code Online (Sandbox Code Playgroud)

CSS:

.table{display:table;}
.tr{display:table-row;}
.td{display:table-cell;}
.tr:hover{background-color:#ccc;}
Run Code Online (Sandbox Code Playgroud)


Kri*_*pta 5

Achieved using standard Bootstrap 4.3+ as follows - no jQuery nor any extra css classes needed!

The key is to use stretched-link on the text within the cell and defining <tr> as a containing block.

<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>
Run Code Online (Sandbox Code Playgroud)

You can define containing block in different ways for example setting transform to not none value (as in example above).

For more information read here's the Bootstrap documentation for stretched-link.

  • 我喜欢这个解决方案,但遗憾的是,它不是跨浏览器的(Chrome/Firefox 可以,但 Safari 不行)。问题是由于“tr”标签不被识别为浏览器中包含块的规则... /sf/ask/4293957391/ -铬合金 (8认同)
  • 这样做的缺点是因为链接将位于列的顶部,您无法复制文本,并且如果将鼠标悬停在 td 中,则不会显示属性标题。所以不幸的是,我必须回到旧的方式,将链接只放在一列中。 (4认同)
  • 这个答案值得更多投票。根本没有 JavaScript。那 `scope="row"` 是做什么用的?我不使用范围,并且该行仍然充当链接。 (3认同)
  • 是的,这似乎确实破坏了 Safari 中的表格链接——悬停行为完全失控。[对 #28608 的评论](https://github.com/twbs/bootstrap/issues/28608#issuecomment-479862777) 似乎表明不可能在具有“stretched-link”的表上获得所需的行为。 (2认同)