如果您没有明确使用 thead 和 tbody,为什么浏览器不寻找第一个添加"tbody" "content row"?



当我看W3school时,最初的教程或示例没有使用ad或tbody,但我有如下jQuery代码:

$("#mytable tbody tr:nth-child(odd)").addClass("oddColor");

$("#mytable tr:nth-child(odd)").addClass("oddColor");

我的桌子看起来是这样的(注意没有thead或tbody标签)

<table>
<tr><th>Col1</th><th>Col2</th></tr>
<tr><td>Row 1</td><td>Row 1</td></tr>
<tr><td>Row 2</td><td>Row 2</td></tr>
<tr><td>Row 3</td><td>Row 3</td></tr>
<tr><td>Row 4</td><td>Row 4</td></tr>
</table>

jQuery是否将"th"行计算为tbody?如果浏览器自动添加tbody,为什么不将其放在"td"行(而不是"th"行)它看起来确实如此,但我本以为它会查找第一行"td"。

很明显,在所有表上添加thead和tbody可以使其100%显式,但我只是对jQuery在没有这些标签的情况下会做什么以及它为什么会这样做感到困惑。

也许一个更好的问题是,如果浏览器添加了tbody,为什么不在td行而不是th行添加tbody?

tbody是自动创建的,如果没有显式使用tbodythead,它将包装所有表行。正文行中允许th,不需要"检查"行的内容来查看哪些行应该是头行或正文行。

如果您想要一个thead,并且从tbody中排除了行,则必须显式添加它——此时还需要添加tbody

请参阅浏览器为什么要将tbody元素插入到表元素中?

在1996年的RFC1942(HTML表)中,Dave Raggett说

表格可分为头部和身体部分。THEAD和TFOOT元素是可选的,但始终需要一个或多个TBODY元素。如果表仅由TBODY部分组成,则可以省略TBODY开始和结束标记,因为解析器可以推断它们。如果存在THEAD元素,则需要THEAD开始标记,但如果后面跟着TFOOT或TBODY开始标记,则可以省略结束标记。TFOOT也是如此。

注意:此定义提供了与为旧模型创建的表的兼容性,并允许省略THEAD、TFOOT和TBODY的结束标记(我强调)

THEAD、TFOOT和TBODY元素为控制渲染提供了一种方便的方法。如果表的正文中有大量行,则用户代理可以选择使用滚动区域来显示表的正文部分。当呈现到分页设备时,表通常必须跨越页面边界。THEAD、TFOOT和TBODY元素允许用户代理在继续处理表体之前,在当前页面的底部重复表脚,然后在新页面的顶部重复表头。

"旧模型"出现在HTML3.0中。尽管HTML 3.0在完成之前就被放弃了,取而代之的是HTML 3.2,但似乎至少有一些网络上的表是在那段时间创建的。上面写着:

内容模型:可选CAPTION,然后是一个或多个表行(TR)

即当时没有TBODY、THEAD或TFOOT元素。

因此,假设当时创建的那些表将期望所有行,无论它们是包含TH元素还是TD元素,都具有与TBODY类似的行为,例如,这些行不会像THEAD和TFOOT分别期望的那样在每个打印页的顶部和底部重复。

因此,为了向后兼容性,仅使用TBODY包装与HTML表的原始使用是一致的。

最新更新