【发布时间】:2012-07-19 05:33:28
【问题描述】:
显然,如果您有一个 </p> 结束标签,而 body 元素中没有匹配的开始标签,那么大多数(如果不是所有)浏览器都会在其位置生成一个空段落:
<!DOCTYPE html>
<title></title>
<body>
</p>
</body>
即使结束标记周围存在任何文本,它也不会成为此 p 元素的一部分——它将始终为空,并且文本节点将始终独立存在:
<!DOCTYPE html>
<title></title>
<body>
some text</p>more text
</body>
如果body 的上述内容被包裹在<p> 和</p> 标签中......我会让你猜会发生什么:
<!DOCTYPE html>
<title></title>
<body>
<p>some text</p>more text</p>
</body>
有趣的是,如果</p> 标记前面没有<body> 或</body> 标记,则除 IE9 和更早版本之外的所有浏览器不会生成一个空段落(IE ≤ 9另一方面将始终创建一个,而 IE10 及更高版本的行为与所有其他浏览器相同):
<!DOCTYPE html>
<title></title>
</p>
<!DOCTYPE html>
<title></title>
</p><body>
<!DOCTYPE html>
<title></title>
</p></body>
我找不到任何引用规定没有相应开始标签的结束标签应该生成一个空元素,但考虑到它甚至不是有效的 HTML,这应该不会让人感到惊讶。事实上,我只发现浏览器使用 p 元素(在某种程度上也使用 br 元素!),但没有任何解释原因。
不过,在使用传统 HTML 解析器和 HTML5 解析器的浏览器中,它是相当一致的,同时适用于 quirks 模式和标准模式。因此,可以推断这是为了向后兼容早期规范或遗留行为。
其实我确实在a somewhat related question的一个回答上找到了this comment,基本就印证了:
标签之所以有效未封闭的原因是,最初
被定义为“新段落”标记,而不是 p 是一个容器元素。相当于
是一个“新行”标记。您可以在 1992 年的文档中看到这样的定义:http://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/Tags.html 和 1993 年的这个文档:http://www.w3.org/MarkUp/draft-ietf-iiir-html-01.txt 因为在更改之前有网页,并且浏览器解析器一直尽可能向后兼容现有的 Web 内容,所以它是总是可以以这种方式使用。
但这并不能完全解释为什么解析器将显式的</p> 结束标记(带有斜杠)简单地视为...一个标记,并在 DOM 中生成一个空元素。当语法没有像more recently 那样严格定义时,这是否是某些解析器错误处理约定的一部分?如果是这样,它是否记录在任何地方?
【问题讨论】:
标签: html dom syntax html-parsing