为什么迷路</ p>结束标记会生成一个空段落?

Bol*_*ock 21 html syntax html5 dom html-parsing

显然,如果元素中的</p>结束标记没有匹配的开始标记body,则大多数(如果不是所有)浏览器都会在其位置生成空段落:

<!DOCTYPE html>
<title></title>
<body>
</p>
</body>
Run Code Online (Sandbox Code Playgroud)

即使在结束标记周围存在任何文本,它们也不会成为此p元素的一部分- 它将始终为空,文本节点将始终存在于自己:

<!DOCTYPE html>
<title></title>
<body>
some text</p>more text
</body>
Run Code Online (Sandbox Code Playgroud)

如果以上内容body被包装<p></p>标记......我会告诉你猜测会发生什么:

<!DOCTYPE html>
<title></title>
<body>
<p>some text</p>more text</p>
</body>
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果</p>标签前面没有<body>或者</body>标签,除了IE9和更旧的浏览器之外的所有浏览器都不会生成空段(另一方面IE≤9将始终创建一个,而IE10和更高版本的行为与所有其他浏览器相同) :

<!DOCTYPE html>
<title></title>
</p>
Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<title></title>
</p><body>
Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<title></title>
</p></body>
Run Code Online (Sandbox Code Playgroud)

我找不到任何引用规定没有相应的开始标记的结束标记应该生成一个空元素,但考虑到它首先不是有效的HTML,这不应该是令人惊讶的.实际上,我只发现浏览器使用p元素执行此操作(在某种程度上也是br元素!),但没有任何解释为什么.

不过,在使用传统HTML解析器和HTML5解析器的浏览器中,它是相当一致的,在quirks模式和标准模式下应用.因此,推断这是为了向后兼容早期规范或遗留行为,这可能是公平的.

事实上,我确实在一个相关问题的答案中找到了这个评论,这基本上证实了这一点:

<p>标签有效未封闭的原因是原来<p>被定义为"新段落"标记,而不是p是容器元素.相当于<br>是一个"新行"标记.您可以在这个文件中看到这样定义从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>那样.

但它并没有完全解释为什么解析器将显式</p>结束标记(带斜杠)视为简单的标记,并在DOM中生成空元素.从回来的路上有些解析器错误处理公约的这一部分时,语法是不是严格定义,因为它是更加 最近的东西?如果是这样,它是否记录在任何地方?

Alo*_*hci 16

则需要在HTML5被记录在案.请参阅http://w3c.github.io/html/syntax.html#the-in-body-insertion-mode并向下搜索An end tag whose tag name is "p",它说:

如果open元素的堆栈在按钮作用域中没有与令牌具有相同标记名称的元素,那么这是一个解析错误; 表现为好像已经看到标签名为"p"的开始标签,然后重新处理当前令牌.

p如果</p>标签无法与现有<p>标签匹配,则翻译为英语意味着创建元素.

为什么会如此,更难确定.通常,这是因为过去某些浏览器会导致这种情况发生,并且网页依赖于行为,因此其他浏览器也必须实现它.