<!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 comment在a 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或某些东西时,这部分解析器错误处理惯例是否可以回溯?如果是这样,是否记录在任何地方?
解决方法
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,网页来依赖这个行为,所以其他浏览器也必须实现它。