为什么FF DOM将节点视为BODY的子节点,即使它们位于BODY标记之前?

时间:2011-06-23 19:59:05

标签: html firefox dom xul xulrunner

我观察过firefox如何将HTML文档中BODY元素之前列出的文本和元素节点移动到BODY元素的直接子节点。

我正在使用xulrunner 2.0.1(Firefox 4.0),虽然我观察到IE也在移动文本,但不是元素。

以下是FF执行此操作的一些示例:

示例HTML文档1 (文本节点和标题元素在正文中移动):

"<html>abc<title>def</title>hij<body>inn<span>e</span>r</body>klm</html>"

使用give:

在Body元素上查询nsIDOMNSHTMLElement.innerHTML
"abc<title>def</title>hijinn<span>e</span>rklm"

通过Body子元素迭代得到:

Text : "abc"
Element : "def"
Text : "hijinn"
Element : "e"
Text : "rklm"

示例HTML文档2 (文本节点在正文中移动但标题不在):

"<html><title>def</title>hij<body>inn<span>e</span>r</body>klm</html>"

使用give:

在Body元素上查询nsIDOMNSHTMLElement.innerHTML
"hijinn<span>e</span>rklm"

通过Body子元素迭代得到:

Text : "hijinn"
Elemnt : "e"
Text : "rklm"

我的问题是为什么会发生这种情况?我原本期望innerHTML只显示两个body标签之间的内容?

3 个答案:

答案 0 :(得分:3)

这是因为BODY标记是可选的,并且解析器假定它被省略。如果省略了标记本身,那么BODY元素仍会显示在DOM中,因为它的存在是隐含的。

HTML 4.01 specification表示开始和结束标记对于BODY元素都是可选的。

答案 1 :(得分:2)

基本答案是“因为HTML5解析算法是这样说的”。更具体地说,只允许某些标记位于<body>之外,其他所有标记都放在<body>内,即使它不在原始数据流中。

答案 2 :(得分:1)

因为您提供了无效的HTML代码。 HTML解析器将始终更正无效的HTML代码。这尤其意味着<html>代码中唯一允许的子代为<head><body><title>标记将移至<head>所属的地方,将文字节点移至<body>。如果您对浏览器如何处理这个“标签汤”感兴趣,http://dev.w3.org/html5/spec/Overview.html#parsing下有一个详细的规范。