535

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

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

26 回答 26

621

作者注一:

请查看下面的其他答案,尤其是不使用 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以及如何编写处理程序;

使用而不是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改用。

于 2013-06-17T12:53:38.267 回答
280

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

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

为指针视图添加样式

[data-href] { cursor: pointer; }

当您处理它时,您会希望使用 JavaScript 在 HTML 之外分配点击处理程序。

于 2013-06-17T12:49:26.583 回答
237

您可以在 every 中包含一个锚点<td>,如下所示:

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

示例 jsFiddle 在这里。

除非您求助于 JavaScript,否则这可能与您将获得的一样最佳。

于 2013-06-17T12:50:55.127 回答
100

可以使用链接表行,但不能使用标准<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;
}
<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>

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

于 2014-04-16T21:41:28.057 回答
60

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

关键是stretched-link在单元格内的文本上使用并定义<tr>为包含块。

<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 文档stretched-link

于 2019-08-21T12:24:11.597 回答
27

一个更灵活的解决方案是使用 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 属性添加到任何元素,它会起作用。当我写这样的片段时,我喜欢它们是灵活的。如果你有,请随意添加一个香草 js 解决方案。

于 2018-08-31T01:10:42.187 回答
11

前面没有提到的一种解决方案是使用单元格中的单个链接和一些 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>

于 2019-10-14T18:46:25.310 回答
9

这是简单的解决方案..

<tr style='cursor: pointer; cursor: hand;' onclick="window.location='google.com';"></tr>
于 2020-04-03T17:44:57.740 回答
8

您可以使用此引导组件:

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

贾斯尼引导

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

<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"<table>or<tbody>元素。对于其他选项,将名称附加到 data- 中,如data-target="a.mainlink"可以通过将.rowlink-skip类添加到<td>.

通过 JavaScript

通过 javascript 调用输入掩码:

$('tbody.rowlink').rowlink()
于 2015-01-15T01:28:40.967 回答
8

您可以将按钮角色添加到表格行,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");
     });
});

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

于 2017-04-12T19:55:21.050 回答
7

有一个很好的方法可以在技术上使用<a>tag inside <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';
}

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

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

于 2017-06-27T18:13:34.407 回答
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>

在这里工作的例子

于 2017-10-11T03:39:46.140 回答
5

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

于 2013-09-25T12:19:19.483 回答
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>

通过 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/

于 2015-06-06T01:23:14.587 回答
4

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

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

于 2015-10-19T12:37:05.510 回答
4

我知道有人已经写了几乎相同的内容,但是我的方式是正确的方式(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;}
于 2017-02-25T21:19:27.243 回答
3

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

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

  1. 使用 JavaScript。
  2. 用锚元素包裹所有表格单元格。
  3. 使用<div>元素而不是原生 HTML 表格元素,以便将表格行作为<a>元素。

本文深入介绍了如何实现每个解决方案(带有 CodePens 的链接),并考虑了边缘情况,例如如何处理您想要在表格单元格中添加链接的情况(嵌套<a>元素不是有效的 HTML,所以你需要解决这个问题)。

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

于 2020-07-16T06:01:42.507 回答
2

另一个使用<a>, 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');
    });
于 2014-06-19T02:25:29.380 回答
2

接受的答案很好,但如果您不想在每个 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 添加点击数据属性。另一个好处是我们没有使用类来触发点击,因为类应该只用于样式。

于 2017-12-01T10:50:01.943 回答
2

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

 <tr onclick="window.location='any-page.php'">
    <td>UserName</td>
    <td>Email</td>
    <td>Address</td>
</tr>
于 2019-08-07T10:24:18.160 回答
1
<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 属性。

于 2018-12-06T23:56:26.723 回答
1

我花了很多时间试图解决这个问题。

有3种方法:

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

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

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

    a)看看这个例子

    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) 设置<td>{ display: contents; }。这会导致另外两个问题:

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

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

    c) 设置<td>{ height: --some-fixed-value; }。这只是不够灵活。

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

于 2019-08-30T00:49:43.950 回答
0

这是另一种方式...

的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";

      });

});
于 2013-06-17T13:19:33.800 回答
0
<table>
  <tr tabindex="0" onmousedown="window.location='#';">
    <td>1</td>
    <td>2</td>
    <td>3</td>
  </tr>
</table>

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

于 2020-04-22T05:20:17.307 回答
-1

你可以给行一个id,例如

<tr id="special"> ... </tr>

然后使用 jquery 说类似的话:

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

于 2013-06-17T12:50:08.520 回答
-11

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

<div>

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

</div>
于 2013-06-17T12:52:51.640 回答