显然,如果元素中</p>没有结束标签而没有匹配的开始标签body,则大多数(如果不是全部)浏览器将在其位置生成一个空段:
</p>
body
<!DOCTYPE html> <title></title> <body> </p> </body>
即使end标记周围存在任何文本,也不会将其作为此p元素的一部分-它将始终为空,并且文本节点将始终独立存在:
p
<!DOCTYPE html> <title></title> <body> some text</p>more text </body>
如果以上内容body都包裹在<p>和</p>标记中,…我将让您猜测会发生什么:
<p>
<!DOCTYPE html> <title></title> <body> <p>some text</p>more text</p> </body>
有趣的是,如果</p>标记之前没有<body>或</body>标记,则除IE9和更早版本之外的所有浏览器都 不会 生成空段落(另一方面,IE≤9始终会创建一个空段,而IE10和更高版本的行为与所有其他浏览器相同) :
<body>
</body>
<!DOCTYPE html> <title></title> </p> <!DOCTYPE html> <title></title> </p><body> <!DOCTYPE html> <title></title> </p></body>
我找不到任何规定没有相应开始标签的结束标签应生成一个空元素的引用,但是考虑到它甚至不是有效的HTML,这也就不足为奇了。确实,我只发现浏览器使用p元素(在某种程度上也包括该br元素!)来执行此操作,但是没有关于原因的任何解释。
br
尽管在传统模式和标准模式下都可以使用传统的HTML解析器和HTML5解析器,但在浏览器中它还是很一致的。因此,可以推断这是为了与早期规范或传统行为向后兼容。
标记有效且未关闭的原因是,最初
被定义为“新段落”标记,而不是p是容器元素。等效于是“换行”标记。你可以看到这个文件中这样定义从1992年:而这一次从1993年:由于存在更改之前的网页,并且浏览器解析器始终与现有Web内容尽可能向后兼容,因此始终可以使用
那样。
但这并不能完全解释为什么解析器将显式</p>结束标记(带有斜线)简单地视为一个标记,并在DOM中生成一个空元素。一些解析器错误处理从归途公约的这一部分时,语法是不是严格定义,因为它是更加最近的东西?如果是这样,是否在任何地方都有记录?
这 则需要在HTML5被记录在案。看到并向下搜索An end tag whose tag name is "p",它说:
An end tag whose tag name is "p"
如果打开元素堆栈在按钮作用域中没有与标记具有相同标签名称的元素,则这是解析错误;就像看到带有标签名称“ p”的开始标签一样,然后重新处理当前令牌。
翻译成英文意味着p如果</p>标签不能与现有<p>标签匹配,则创建一个元素。
为什么 会这样,很难确定。通常,这是因为过去某些浏览器导致此错误的发生,并且网页开始依赖此行为,因此其他浏览器也必须实现它。