为什么一个杂散的结束标记会生成一个空的段落?

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

 <!DOCTYPE html> <title></title> <body> </p> </body> 

即使在结束标记周围存在任何文本,也不会将其作为此p元素的一部分 – 它将始终为空,并且文本节点将始终独立存在:

 <!DOCTYPE html> <title></title> <body> some text</p>more text </body> 

如果body的上述内容被包裹在<p></p>标记中,我会留给你猜测会发生什么:

 <!DOCTYPE html> <title></title> <body> <p>some text</p>more text</p> </body> 

有趣的是,如果</p>标签前面没有<body></body>标签,除了IE9和更老版本的浏览器都不会生成空白段落(IE≤9则始终创build一个) IE10和更高版本的行为与所有其他浏览器相同):

 <!DOCTYPE html> <title></title> </p> 
 <!DOCTYPE html> <title></title> </p><body> 
 <!DOCTYPE html> <title></title> </p></body> 

我找不到任何引用规定,没有相应的开始标签的结束标签应该生成一个空的元素,但不应该让人感到意外,因为它甚至不是有效的HTML。 事实上,我只find浏览器用p元素(以及某种程度上也是br元素)来做到这一点,但是为什么没有任何解释。

在使用传统的HTMLparsing器和HTML5parsing器的浏览器中,它是相当一致的,不过,在怪癖模式和标准模式下都适用。 所以,这可能是公平的,这是为了向后兼容早期规范或传统行为。

事实上,我的确发现了这个评论的答案, 这个问题基本上证实了这个问题:

为什么<p>标签有效的原因是原来的<p>被定义为“新的段落”标记,而不是p是一个容器元素。 相当于成为“新线”的标志。 你可以从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由于网页预先约定了更改,浏览器parsing器一直与现有网页内容向后兼容,所以始终可以使用<p>那样。

但是这并不能解释为什么parsing器将一个显式的</p>结束标记(用斜杠)当作简单的…标记,并在DOM中生成一个空元素。 当语法不像严格定义的那样,某些parsing器error handling惯例的这个部分是从哪里来的? 如果是这样,它是否在任何地方logging?

2 Solutions collect form web for “为什么一个杂散的结束标记会生成一个空的段落?”

是必需的是在HTML5中logging。 请参阅http://dev.w3.org/html5/spec/tree-construction.html#parsing-main-inbody并向下searchAn end tag whose tag name is "p"并说:

如果打开元素的堆栈在标记名称相同的button范围中没有元素,那么这是一个分析错误; 就好像已经看到标签名称为“p”的开始标签,然后重新处理当前令牌。

翻译成英文意味着如果</p>标签不能与现有的<p>标签匹配,则创build一个p元素。

为什么是这样,很难确定。 通常情况下,这是因为过去一些浏览器导致这种错误发生,并且网页依赖于行为,所以其他浏览器也必须执行它。

HTML4 DTD指出,段落元素的结束标记是可选的,但是开始标记是必需的。

HTML4的SGML声明指出omittag是'yes',这意味着可以暗示开始标签。

结束标签遵循SGML规则:

结束标记closures,返回到匹配的开始标记,所有未封闭的中间开始标记都被省略了结束标记

为内联元素(如文本节点)生成匿名块框 ,因此不需要由段落元素包装。

Mozilla缺陷数据库中有一个线程解释了这种行为:

  • Mozilla善于parsing“半标签”,从而导致XSS安全问题

以下是鲍里斯·扎巴斯基 ( Boris Zbarsky)的相关评论:

实际上,据我所知,正确parsingSGML / HTML 需要我们这样做。 也就是说,下一个标记的“<”是closures以前标记的标记的有效方法…

Ian Hickson总结道:

这里工作的基本原理是,标记是通过延迟任何结束标记来确定的,直到closures所有其他打开的元素为止,并且不会尝试使DOM遵循HTML DTD。

参考

  • SGML制作

  • HTML 2.0规范

  • 对SGML的争论

  • 标签汤:UA如何处理

  • 标签汤:如何Mac IE 5和Safari处理

  • Web SGML和HTML 4.0解释

  • 跨浏览器testingSGML SHORTTAG支持

  • Mozilla错误226495

  • Shorttag和Omittag

  • SGML-系列文档语言的parsing器logging:SGML,HTML,XML

  • XML – bobdc.blog简要的,自以为是的历史

  • HTML5:Iframe没有滚动?
  • 如何将图像上传到HTML5canvas
  • embedded与对象
  • 我可以将所需的属性应用于HTML5中的<select>字段吗?
  • Angular JS Scaling&Performance
  • 如何使用Servletstream式传输audio/video文件,如MP3,MP4,AVI等
  • 以编程方式在<canvas>的fillStyle中使用RGBa值?
  • 你如何deviseHTML5表单validation信息?
  • 在CSS中设置最大字符长度
  • 如何创build一个在Bootstrap 3中也可以扩展的响应式图像
  • 在inputtypes=“数字”上禁用webkit的旋转button?