屏幕截图显示了萤火虫监视窗口。
为什么它解析几乎相同的 HTML 是错误的?我预计第二行中只有一个元素,而不是元素数组。
浏览器没有错。<p><div></div></p>
是无效的 HTML。
浏览器之所以分析不同的两个代码是因为<p>
元素只允许包含inline elements
.
两者<p>
和<div>
都是block elements
但<p>
不能包含<div>
不是短语内容的。因此,当浏览器读取该代码时,他会找到该元素<p>
,然后是意外的<div>
. 浏览器对标记错误非常宽容,因此浏览器关闭p
标签并转到下一个 div 元素。然后是第三个元素,(也是错误的 HTML,因为它错过了开始标签)所以它被读取为一个新元素。
在第一种情况下,您有嵌套元素,因此浏览器显示一个元素;
在第二种情况下,您在同一个 DOM 树级别中有三个元素,因此浏览器会回答一个元素数组。
它们都渲染,但错误的渲染可能会产生意想不到的结果。浏览器将如何读取错误的标记加上CSS
将很难预测。
因此,浏览器将代码读取/解析为: <p></p><div></div><p></p>
,给您不同的结果。
W3/HTML5规范:
p – 段落
div – 通用流容器。
无论哪种情况,结果都没有错。
<p>
HTML 标记只能包含短语内容元素。但是,<div>
不是短语内容(而是一个流程元素)。(Simplified<p>
可能包含内联元素,但<div>
它是块元素。)因此,第二个示例中的 HTML 代码无效(因为不符合标准)。
结果是浏览器 HTML 到 DOM 解析器——当然是由 jQuery 触发的——处理 HTML 如下:
<p>
正在打开的块<div>
正在打开的块<p>
<p>
块所以等效的 HTML 代码是 <p></p><div></div><p></p>
,它是有效的 HTML。因此解析器会为您更正 HTML。
因为我们现在拥有三个顶级元素,而不是一个顶级元素的嵌套元素,所以您会得到一个DOM 元素数组,而不是像您预期的那样一个元素。
网络浏览器对不符合标准的 HTML 代码非常健壮。您在此处注意到并指出的行为是解析器尽最大努力从无效 HTML 代码中理解的众多示例之一。
参考: