html – 为什么流浪结束标签生成一个空的段落?

前端之家收集整理的这篇文章主要介绍了html – 为什么流浪结束标签生成一个空的段落?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
显然,如果你有一个< / p>结束标签在body元素中没有匹配的开始标签,大多数(如果不是全部)浏览器将在其位置生成一个空白段落:
<!DOCTYPE html>
<title></title>
<body>
</p>
</body>

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

<!DOCTYPE html>
<title></title>
<body>
some text</p>more text
</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解析器,但是跨浏览器使用的方式相当一致,而且在标准模式和标准模式下都适用。因此,推断这是为了与早期规范或遗留行为的向后兼容性可能是公平的。

事实上,我确实发现this commenta somewhat related question的答案,这基本上证实了:

The reason why <p> tags are valid unclosed is that originally <p> was defined as a “new paragraph” marker,rather than p being a container element. Equivalent to <br> being a “new line” marker. You can see so defined in this document from 1992:07002 and this one from 1993: 07003 Because there were web pages pre-dating the change and browser parsers have always been as backward compatible as possible with existing web content,it’s always stayed possible to use <p> that way.

但是这并不能解释为什么解析器对待一个显式的< / p>结束标签(带斜杠)只是一个标签,并在DOM中生成一个空的元素。当语法没有严格定义为more recently或某些东西时,这部分解析器错误处理惯例是否可以回溯?如果是这样,是否记录在任何地方?

解决方法

需要的是在HTML5中记录。请参阅 http://dev.w3.org/html5/spec/tree-construction.html#parsing-main-inbody搜索标签名称为“p”的结尾标签,并说:

If the stack of open elements does not have an element in button scope
with the same tag name as that of the token,then this is a parse
error; act as if a start tag with the tag name “p” had been seen,then
reprocess the current token.

翻译成英文意思是创建一个p元素,如果< / p>标签不能与现有的< p>标签

为什么是这样,更难确定。通常这是因为一些浏览器在过去造成这种情况发生,作为一个bug,网页来依赖这个行为,所以其他浏览器也必须实现它。

猜你在找的HTML相关文章