显然,如果你有一个< / p>结束标签在body元素中没有匹配的开始标签,大多数(如果不是全部)浏览器将在其位置生成一个空白段落:
即使在结束标签周围存在任何文本,它也不会成为此p元素的一部分 – 它始终为空,文本节点将始终存在:
some text
more text如果身体的上述内容包裹在< p>和< / p>标签…我会让你猜猜会发生什么:
some text
more text有趣的是,如果< / p>标签之前没有< body>或< / body>除IE9及以上版本之外,所有浏览器都不会产生空白的段落(IE≤9,另一方面始终会创建一个,IE10和以后的行为与所有其他浏览器的行为一样):
我找不到任何引用,规定没有相应的开始标签的结束标签应该生成一个空的元素,但是不要以为它不是甚至没有有效的HTML首先出现的惊讶。实际上,我只发现浏览器使用p元素(以及某种程度上的br元素也可以这样做),但是没有解释为什么。
尽管使用传统的HTML解析器和HTML5解析器,但是跨浏览器使用的方式相当一致,而且在标准模式和标准模式下都适用。因此,推断这是为了与早期规范或遗留行为的向后兼容性可能是公平的。
The reason why
tags are valid unclosed is that originally
was defined as a “new paragraph” marker,rather than p being a container element. Equivalent to
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
that way.
但是这并不能解释为什么解析器对待一个显式的< / p>结束标签(带斜杠)只是一个标签,并在DOM中生成一个空的元素。当语法没有严格定义为more recently或某些东西时,这部分解析器错误处理惯例是否可以回溯?如果是这样,是否记录在任何地方?
@H_404_32@
需要的是在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,网页来依赖这个行为,所以其他浏览器也必须实现它。
@H_404_32@
@H_404_32@
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。