ChatGPT解决这个技术问题 Extra ChatGPT

如何使表格中的整行可单击为链接?

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

<tbody>
    <a href="#">
        <tr>
            <td>Blah Blah</td>
            <td>1234567</td>
            <td>£158,000</td>
        </tr>
    </a>
</tbody>
JavaScript 可能会更好
他正在使用引导程序,所以我认为他应该能够做到:)
在行前放置一个透明的 A 元素怎么样?这样,它将具有真实链接的所有属性(状态栏、中间单击等),并且不会更改表格的外观(如果需要)。

C
Community

作者注一:

请查看下面的其他答案,尤其是不使用 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


您可能还想使用 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 标记有点烦人,但这似乎是解决此问题的最有用的方法。
D
Davy de Vries

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

<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”类事件绑定方法在被点击的行中查找第一个 <a>。 (这也会优雅地降级)
如果您使用 ES6 语法,您可以像这样执行链接点击:onClick={() => window.open('https://stackoverflow.com/', '_blank')}
C
Community

您可以在每个 <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; 
}

Example jsFiddle here.

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


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

可以使用链接表行,但不能使用标准 <table> 元素。您可以使用 display: table 样式属性来完成。 Herehere 是一些要演示的小提琴。

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

.table { 显示:表格; } .row { 显示:表行; } .cell { 显示:表格单元格;填充:10px; } .row:hover { 背景颜色:#cccccc; } .cell:hover { 背景颜色:#e5e5e5; }

1.1
1.2
1.3
2.1
2.2
2.3

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


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

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

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

< td>桑顿
1 Mark Otto @mdo
2 Jacob @fat
3 拉里 小鸟< /td> @twitter

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

有关更多信息,请阅读此处的 stretched-linkBootstrap documentation


这个答案值得更多投票。根本没有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
A
AbdelElrafa

一个更灵活的解决方案是使用 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 解决方案。


M
Murad

这是简单的解决方案..

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

p
passatgt

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

表格 { 边框:1px 实心;宽度:400px;溢出:隐藏; } tr:hover { 背景:灰色; } tr td { 边框:1px 实心; } tr td:first-child { 位置:相对; } a:之前{内容:'';位置:绝对;左:0;顶部:0;底部:0;显示:块;宽度:400px; }

第一栏 第二栏 第三栏
第一栏 第二栏 第三栏


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

您可以使用此引导组件:

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

通过 JavaScript

通过 javascript 调用输入掩码:

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

T
Todd Skelton

您可以将按钮角色添加到表格行,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 代码。只需将光标更改为手指。
R
Ronen

有一个很好的方法可以在技术上使用 <tr> 中的 <a> 标记,这可能在语义上不正确(可能会给您一个浏览器警告),但不需要 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+点击)


这不是与 my answer 基本相同吗?
虽然这个答案看起来很完美,但实际上并没有用,因为 <tr> 元素不能将 <a> 元素作为子元素。只有 <td><th> 是有效的子代。请参阅:stackoverflow.com/questions/12634715/…
W
Wendell Pereira

在我看来,一个非常简单的选择就是使用点击,而且更正确,因为这将视图和控制器分开,并且您不需要硬编码 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 根据您希望行单击执行的操作,这可能会出现问题,例如导航无法正常工作 - 在新选项卡/窗口中打开时没有切换单击,没有悬停查看目的地等。
A
Anahit Serobyan

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


D
David Balažic

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

是一个真正的链接元素:悬停改变指针,在状态栏中显示目标链接,可以键盘导航,可以在新选项卡或窗口中打开,可以复制 URL 等

该表看起来与未添加链接时相同

表代码本身没有变化

缺点:

元素的大小必须在脚本中设置,无论是在创建时还是在对其覆盖的行的大小进行任何更改之后(否则它可以完全不使用 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
A
Aydan Aleydin

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

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


S
Sidupac

我知道有人已经写了几乎相同的内容,但是我的方式是正确的方式(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;}

A
Ali Raza

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

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

R
Y
Yisela

另一种选择使用 <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');
    });

T
Thomas Williams

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


g
gamliela

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

有3种方法:

使用 JavaScript。明显的缺点:无法在本地打开新选项卡,并且当将鼠标悬停在行上时,状态栏上不会像常规链接那样显示任何指示。可访问性也是一个问题。仅使用 HTML/CSS。这意味着将 嵌套在每个 之下。像这种小提琴这样的简单方法不起作用 - 因为每列的可点击表面不一定相等。这是一个严重的用户体验问题。此外,如果您需要在该行上添加一个

C
Christopher Vickers
<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 属性。


k
klewis

这是另一种方式...

的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
s
stevec

这是一个通用的方法。定义这个CSS:

// css
td a.linker {
    color:#212529;
    display: block;
    padding: 16px;
    text-decoration: none;
}

然后将其放在每个 td 中:

<td>
  <a class="linker" href="www.google.com"> 
    Cell content goes here 
  </a>
</td>

P
Peter Berg

你可以给行一个id,例如

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

然后使用 jquery 说类似的话:

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


我相信你想使用 class 而不是 id 因为你很可能会有多行并且 id 应该只用于一个项目。
R
Ramesh J

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

<div>

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

</div>

您应该使用 css display:table 改进您的答案
通过添加 css 改进答案