为什么浏览器仍然在HTML5中注入<tbody>?

Ray*_*nos 33 html html5

HTML5 doctype示例.

IE9和Chrome14都记录TBODYtagName内部元素<table>

HTML5规范<table>清楚地说明:

后跟零个或多个tbody元素或一个或多个tr元素

此外.HTML5规范<tr>清楚地说明:

作为表元素的子元素,在任何标题,colgroup和thead元素之后,但仅当没有tbody元素是table元素的子元素时.

为什么浏览器会破坏我的DOM并注入<tbody>时间

  • 我没有要求一个
  • 没有一个它是完全有效的

"向后兼容性"的答案绝对没有意义,因为我特意选择了HTML5文档类型.

dur*_*uri 39

"向后兼容性"的答案绝对没有意义,因为我特意选择了HTML5文档类型.

但是,浏览器不区分HTML版本.具有HTML5 doctype和HTML4 doctype的HTML文档(除了FPI中没有URL的HTML4过渡文档类型的小例外)将以相同的方式进行解析和呈现.

我将引用HTML5解析器描述的相关部分:

8.2.5.4.9"表中"插入模式

...

标记名称为以下值之一的开始标记:"td","th","tr"

就像看到标签名为"tbody"的开始标记令牌一样,然后重新处理当前令牌.


zzz*_*Bov 18

您完全错过了HTML5规范中指定树构造方式的部分.

规范允许你编写一个table没有tbody暗示的元素.就像您跳过html,headbody打开或关闭标签一样,您的页面仍然可以正确呈现.

我假设您希望DOM包含一个body内容,如果它因任何原因被遗漏.同样的道理tbody.它已添加,因为它明确假设您忘记自己添加它.

表解析的规则

标记名称为以下值之一的开始标记:"td","th","tr"

就像看到标签名为"tbody"的开始标记令牌一样,然后重新处理当前令牌.


Šim*_*das 7

根据我的经验,浏览器不区分HTML5和HTML4文档.它们的行为相同.在<!doctype html>不触发浏览器中的任何特殊行为.

而且<!doctype html>没有保留的"HTML5文件" -这只是最简单的可能的doctype触发标准模式.

  • @Raynos我不使用名称"HTML5文档".网页是HTML文档.有些网页使用的功能是第一次在HTML5中定义,有些则没有.但它们都是HTML文档.我的回答可能是:命名HTML文档HTML5文档有什么意义? (4认同)
  • @Šime - 对于*浏览器*,这是唯一的原因.*验证者*是不同的. (3认同)
  • 那么拥有一个html5文档有什么意义呢? (2认同)

Alo*_*hci 5

其中大部分都是因为HTML5将HTML 4和XHTML 1.x的后继版本合并为单个规范.

当引入XHTML 1.0并且浏览器开始尝试使用XML解析器时,他们遇到了问题.作者习惯于在<table>没有<tbody>s 的情况下写作.由于不允许XML解析器推断像HTML解析器那样的标签,因此帮助作者转换到XHTML(当时看起来像个好主意)的最佳方法是通过允许<tr>s成为正确呈现的表.<table>DOM内部的直接孩子.(DOM尽可能相同,无论它是源自HTML解析还是XML解析.)因此浏览器实现了对此的支持.

现在,HTML5内容模型在HTML5的HTML和XHTML序列化之间共享,因此它必须允许两种安排,即有或没有tbody.

另一方面,在"HTML语法"(不适用于XML解析器)一节中,它清楚地表明HTML解析将推断tbody标签.

<table><tr><td>my text</td></tr></table>作为text/html在DOM中创建的表结构提供时,将tr作为tbody的直接子项,该tbody是表的直接子项.HTML5内容模型说这没关系.

<table><tr><td>my text</td></tr></table>作为application/xhtml+xml在DOM中创建的表结构提供时,将tr作为表的直接子项.HTML5内容模型说这也没关系.

也可以通过脚本创建一个tr作为表的直接子代.出于同样的原因,浏览器会将此视为表格行,正如大多数人所期望的那样.

  • 对.而库代码经常这样做.但是XHTML的不同之处在于,大多数将其作为XML提供服务的作者使用不同的脚本和CSS来避免这些问题. (3认同)