从HTML加载DOM:HTML解析器如何知道空元素何时结束

20

在XML中,空元素有相应的标记,标记为“/>”。但是在HTML中不存在这种情况。因此,HTML解析器需要一个有限的元素列表,可以为空。如果这样的元素具有结束标记,会怎样呢?


2
这在HTML5(“living”)规范中有记录;有点枯燥,但都在那里。还要注意一些元素,例如BR具有“无内容”,这与“空内容”不同。 - user2864740
1
@user2864740:“如果thead元素紧接着是tbody或tfoot元素,则可以省略thead元素的结束标记。” 嗯,这比元素列表还糟糕。 - user877329
2个回答

12

在HTML中,有些标记有一个结束标记,而有些则没有。随着HTML5的引入,这更加令人困惑。在进行了大量研究后,我目前找到的情况如下。希望你能理解 :)

HTML解析器是否拥有可以为空的元素的有限列表。

答案:是的,HTML解析器有一份有限的空元素列表。解析器对解析具有一定规则,并将忽略空标记。

以下是可能为空的元素。(来源:Mozilla文档

<link>
<track>
<param>
<area>
<command>
<col>
<base>
<meta>
<hr>
<source>
<img>
<keygen>
<br>
<wbr>
<colgroup> when the span is present
<input>

在HTML中,对于空元素使用闭合标签是无效的。例如,<input type="text"></input> 是无效的HTML,解析器将忽略这些标签。
“空元素(void elements)”是通过错误引入到HTML中的:表示性标记进入了语言中,违反了SGML的精神,并带有一些奇怪的语法影响。这个根本性错误导致了一些技术问题,如HTML和XHTML之间意外的差异,导致验证时出现意外结果。更重要的是,它说明了决定正式地将HTML作为“SGML应用程序”的决策的影响。 "空元素"不仅仅是看起来那样。
如果这样的元素有结束标记呢? 解析器将忽略具有结束标记的元素,并消耗下一个元素或字符进行解析。解析器会抛出一个被忽略的语法错误。
来源(值得阅读): cs.tut.fi empty elements research paper)

阅读这篇w3c文章,它关于HTML空元素(无内容元素)W3C链接

456bereastreet的文章关于空元素

空元素的颜色耀斑文章 Colorglare链接


4
HTML解析器有一份有限的可以为空的元素列表。
是的。HTML解析器了解HTML规则,并且这些规则指定哪些元素没有结束标记(或可选的结束标记)。
例如:
一个开始标记,其标记名称是以下之一:“area”,“br”,“embed”,“img”,“keygen”,“wbr”......插入标记的HTML元素。 立即从打开元素堆栈中弹出当前节点。
如果这样的元素有一个结束标记会怎么样?
那么它是无效的 - 就像任何其他未打开标签的结束标记一样 - 解析器到达时将丢弃该标签。
如果节点不是当前节点,则会发生解析错误。

6
你应该包含你引用的来源。 - approxiblue

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