【问题标题】:Is it semantically correct to put a table row <tr> inside an <a> tag?将表格行 <tr> 放在 <a> 标记中在语义上是否正确?
【发布时间】:2015-02-21 01:19:49
【问题描述】:

此表包含有关特定元素集的数据,我希望行的每个字段或所有行都允许用户访问每个元素的详细信息。问题是我也不知道该怎么做:

将整行放入&lt;a&gt;

<table>
    <a href=""><tr>…</tr></a>
    <a href=""><tr>…</tr></a>
    …
</table>

或者只是将每个单元格的所有内容放入&lt;a&gt;

<table>
    <tr>
        <td><a href="">…</a></td>
        <td><a href="">…</a></td>
    </tr>
    …
</table>

当然我更喜欢第一个,但我不知道这样做是否正确。

这是我得到在锚标记中围绕行的想法的来源之一:

HTML5: Wrap Block-Level Elements with A’s

更新:

我想我必须更清楚一点,表格包含数据以显示系统中Users的概述:

+----+------+-------+
| Id | Name | Score |
+----+------+-------+
| 1  | Foo  | 10    |
| 2  | Bar  | 8     |
| 3  | Baz  | 5     |
| …  | …    | …     |
| n  | Zzz  | 0     |
+----+------+-------+

所以我认为使用表格是正确的,但是每个用户都有超过 3 个相关信息字段,所以我会使用链接来访问每个用户的详细信息(15 个以上字段),否则会显示太多在表格的单行上(例如,包含 2048 个以上字符的“评论”字段);这就是为什么我想出了显示每个用户详细信息的链接的想法。当然我不在乎整行是否可点击,我只是想通过不必将每个字段的所有数据包围到&lt;a&gt; 中来稍微清理一下代码。另一种解决方案是创建一个额外的单元格来专门保存指向用户详细信息的链接,如下所示:

+----+------+-------+-------------------------+
| Id | Name | Score |         Options         |
+----+------+-------+-------------------------+
| 1  | Foo  | 10    | (detail) (misc. option) |
| 2  | Bar  | 8     | (detail) (misc. option) |
| 3  | Baz  | 5     | (detail) (misc. option) |
| …  | …    | …     | …                       |
| n  | Zzz  | 0     | (detail) (misc. option) |
+----+------+-------+-------------------------+

但我不知道这是否也适合任何用户体验指南(在这种情况下,我认为没有任何语义规则那么严格,并且是更明智的解决方案)。当然,对于每个不同的选项,我会在同一字段(表格单元格)中包含几个 &lt;a&gt;,但我认为这不违反任何语义规则。

【问题讨论】:

  • 第一个是无效标记。所以不,第二个是你最好的选择。
  • 如果您希望能够点击表格行,您需要使用 Javascript 为其添加点击监听器。
  • @tymeJV 好吧,我最近读到,根据 HTML5,放置块级 () 元素现在在语义上是正确的,它提供了有关 &lt;div&gt;&lt;h*&gt; 和其他元素的示例,但没有关于 @ 987654334@s。 (信息在这里)[davidwalsh.name/html5-elements-links].
  • @Barmar 我宁愿远离 js,因为我正在关注不引人注目的 javascript 开发。
  • &lt;tr&gt;s 不是块级元素,所以不,它不起作用。事实上,&lt;a&gt; 元素会被 HTML 解析器从表格中弹出。

标签: html semantics


【解决方案1】:

如果您将链接应用到&lt;tr&gt; 元素,点击该行上的anywhere 会将用户转到该链接。这包括不是表格单元格的空间,例如单元格边框。

这同样适用于&lt;td&gt; 元素。放在里面只链接文本,放在外面链接整个元素。

<a href=""> <td></td> </a>  //Links whole cell
<td> <a href=""></a> </td>  //Only links text inside <a>

您的两个选项都有效,但它们应该做不同的事情。通常,标记整个表格行在语义上是不正确的,因为这会导致链接重叠和其他问题。

或者...

您可以使用 一点 的 JavaScript 代替:

<table>
    <tr onclick="window.location.replace='...'"></tr>
</table>

更多信息: Link entire table row?

【讨论】:

【解决方案2】:

您的第一个代码是无效标记,因为 &lt;td&gt; 只能是 &lt;tr&gt; 的子代。您可以使用您的第二个代码,但我建议您使用一些 JavaScript,如下所示:

for (i = 0; i < document.querySelectorAll('td').length; i++) {
  document.querySelectorAll('td')[i].addEventListener('click', function() {
    window.location.href = this.getAttribute('data-link');

  });
}
&lt;td data-link="http://example.com"&gt;text and content&lt;/td&gt;

【讨论】:

【解决方案3】:

如果您想“链接”整个“行”,那么您可能实际上没有表格数据,应该考虑table 元素以外的其他内容。

【讨论】:

  • 该表包含一组“用户”的数据,每一行都是指向用户详细信息的链接。所以我认为使用表格来概述用户是合适的,链接整行(不仅仅是名称)的想法是每个字段都与同一个用户相关(我会考虑包括一个额外的字段专门用于保存指向用户详细信息的链接)。
  • 那是表格数据。一个常见的习惯是只链接自己的列,或者有一个明确的“按钮”来查看详细信息。 'javascript' 路线可能对你有意义。
【解决方案4】:

您的第二个选项是语义上正确的方法。如果您要做的只是向其中添加锚元素,那么您可能一开始就不需要该表。您可以将它们添加到两个单独的跨度中。

【讨论】:

    猜你喜欢
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    相关资源
    最近更新 更多