Jquery 为什么不';t浏览器寻找第一个;“内容行”;加入「;t车身“;如果你没有';不要显式地使用thead和tbody?

Jquery 为什么不';t浏览器寻找第一个;“内容行”;加入「;t车身“;如果你没有';不要显式地使用thead和tbody?,jquery,html-table,Jquery,Html Table,当我查看或示例时,不使用thead或tbody,但我有如下jQuery代码: $("#mytable tbody tr:nth-child(odd)").addClass("oddColor"); 或 我的桌子看起来像这样(注意没有thead或tbody标签) 冷水 第1行第1行 第2行第2行 第3排第3排 第4排第4排 jQuery是否将“th”行计算为tbody?如果浏览器自动添加到tbody中,为什么不将其放在“td”行(而不是“th”行) 看起来是这样,但我原以为它会查找第一行“t

当我查看或示例时,不使用thead或tbody,但我有如下jQuery代码:

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

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


冷水
第1行第1行
第2行第2行
第3排第3排
第4排第4排
jQuery是否将“th”行计算为tbody?如果浏览器自动添加到tbody中,为什么不将其放在“td”行(而不是“th”行) 看起来是这样,但我原以为它会查找第一行“td”

显然,通过在所有表上添加thead和tbody,可以使其100%显式,但我只是对jQuery在没有这些标记时所做的事情以及为什么它会这样做感到困惑


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

tbody
是自动创建的,如果没有显式使用
tbody
thead
,则会包装所有表行
th
允许在正文行内,不需要“检查”行的内容以确定哪些行应为标题行或正文行

如果您想要一个
thead
,并且从
tbody
中排除行,则必须明确地添加它-此时您还需要添加
tbody

戴夫·拉格特说,从1996年起,参见

表格可分为头部和身体两部分。THEAD和TFOOT元素是可选的,但始终需要一个或多个TBODY元素。如果表只包含一个TBODY部分,那么TBODY开始标记和结束标记可以省略,因为解析器可以推断它们。如果存在THAD元素,则需要THAD start标记,但如果后面有TFOOT或TBODY start标记,则可以省略end标记。这同样适用于TFOOT

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

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

这个。虽然HTML3.0在完成之前就被放弃了,取而代之的是HTML3.2,但似乎在这段时间内至少创建了一些web表。它说:

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

也就是说,当时没有TBODY、THEAD或TFOOT元素

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


因此,为了向后兼容,只有使用TBODY包装才能与HTML表的原始用途保持一致。

为什么不自己添加它们呢?我在问题中添加了这一点。我对浏览器的行为更感好奇,如果一行包含一些th元素和一些td元素会怎么样。那么浏览器会做什么呢?
$("#mytable tr:nth-child(odd)").addClass("oddColor");
<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>