为什么Firebug会在<table>中添加<tbody>标签?

30

我查看了HTML源代码,没有发现<tbody>标签,但是当我在HTML选项卡下使用Firebug查看时,<tbody>标签出现了。你知道这是为什么吗?


(来自@baptx)奇怪的是,使用JavaScript createElement/appendChild创建一个没有tbody的表格不会添加tbody,但使用innerHTML会添加。为什么?我在这里提出了问题:http://stackoverflow.com/questions/9053572/no-automated-tbody-with-createelement-appendchild - Dan Blows
当我试图将我的HTML解析器的输出与Firefox的HTML进行比较时,这让我非常恼火。 - lesderid
1
可能是为什么浏览器会在表格元素中插入tbody元素?的重复问题。 - Ciro Santilli OurBigBook.com
5个回答

20

总结bobince、Kieron、Alohci等人在回答和评论中提供的优秀解释:

  1. Firebug只显示解析页面的DOM。由于复杂的HTML解析规则,DOM将在某种意义上与源HTML有所不同。
  2. 在这种情况下,DOM中的TBODY元素是由HTML解析器添加的。请注意,这种奇怪的解析仅限于text/html文档,在XHTML中,DOM与源XML非常相似。
    • 这种行为在HTML 4中进行了规定。table的内容模型(允许的子项)是(CAPTION?,(COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+) -- tr只允许在tbody中!规范指出,tbody的开始标记是可选的,这意味着如果HTML解析器直接在table中遇到tr,它会插入作者省略的tbody开始标记。
    • 更清晰的是,HTML 5为此定义了非常详细的解析规则,特别是对于这种情况:“当插入模式为“in table”时,必须按以下方式处理标记:[...]一个开始标记,其标记名称是“td”,“th”,“tr” -> 像看到一个标记名称为“tbody”的开始标记令牌一样,然后重新处理当前标记。”

6

这不是Firebug,而是Firefox的行为。这是表格应该编写的方式,<TBODY>应该与元数据(如<COLGROUP>)分开。当Firefox发现缺少<TBODY>标签时,它会自动插入。


8
不是 Firefox,而是 Gecko :P - Christian C. Salvadó
8
关于“为什么”:表格应该有一个 TBODY,因此 Firefox 内部机制希望有一个存在。如果你没有明确指定它,它会自己创建它,因为它希望有一个存在。即使你愿意在地板上吃饭,服务员也会让你坐在桌子旁边,因为他想要有一张桌子在那里。;o) - deceze
@deceze,这是Firefox的决定。W3C标准并没有规定tbody是必须的,除非你有thead或tfoot。 - paxdiablo
2
显然,标准可以双向阅读。事实上,元素存在并且应该被使用,但如果没有歧义,它的声明可以被跳过。在内部,浏览器总是假定它存在,因为这样实现起来更容易。如果你的意思是“它不一定要在那里”,你指的是“它的显式声明可以被跳过”,那我同意。然而,元素应该始终隐含地存在,这就是你在Firebug中看到的内容。不要将标记与解释结果混淆。 - deceze
2
标准解释上的来回讨论真是太棒了。就像那句经典的话:难道<TPAIN>总是要被< AUTOTUNE >包裹吗? ;) - micahwittman
显示剩余3条评论

4
火狐浏览器这么做是因为标准规定了这样的要求。

TABLE元素实际上不允许直接包含TR元素,它们必须包含在THEADTFOOTTBODY元素中。但为了简单和向后兼容性,当表格仅包含一个表主体且没有表头或表脚部分时,可以省略TBODY的开始标签,此时浏览器会自动推断该元素。


虽然不是最幽默或机智的,但这个答案是_正确的_。 - shylent
1
这绝对不是正确答案。如果你要链接到标准然后发表评论,你可能需要确保你的评论是正确的。标准规定:“TBODY开始标记是可选的,结束标记也是可选的”,“除非表格只包含一个表体且没有表头或表尾部分,否则始终需要TBODY开始标记。TBODY结束标记可以始终安全地省略”。 - paxdiablo
5
这是“开始标签可选”所表示的意思。你可以省略开始标签,但HTML解析器仍必须假定元素存在。table的内容模型为(CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+);请注意,其中并没有包括tr。这就像当你忘记了<body>标签时,解析器会在你使用类似于<div>的必须出现在body中的元素时暗示它的存在。 - bobince
2
请注意,对于XHTML 1.0来说情况有所不同,因为XML中不存在奇怪的SGML“起始标签可选”功能(值得庆幸)。在这种情况下,内容模型包括(tbody+|tr+):您可以使用tbodies或裸露的trs,但不能混合使用。在作为XML解析模式提供服务时,Firefox不应添加隐含的tbody元素。 - bobince
1
@bobince,无论解析器是否暗示,标签都是可选的。问题是为什么出现了这个标签。 - paxdiablo
5
@paxdiablo,没错。但是答案是Firebug不显示标签,它显示元素。标签是可选的,元素不是。(现在的问题没有使用“标签”或“元素”这个词,但是已经被编辑过了,可能最初有这个词)。 - Alohci

1

иҝҷдёҚжҳҜз”ұFirebugж·»еҠ зҡ„пјҢиҖҢжҳҜз”ұFirefoxж·»еҠ зҡ„гҖӮFirebugеҸӘдјҡжҳҫзӨәе®һйҷ…зҡ„DOMз»“жһ„гҖӮеҰӮжһңдҪ жөҸи§Ҳеҗ„дёӘDOMе…ғзҙ пјҢдҪ дјҡжіЁж„ҸеҲ°Firefoxд№ҹж·»еҠ дәҶдёҖдәӣиҮӘе·ұзҡ„ж ·ејҸе…ғзҙ гҖӮ


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接