我观察过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标签之间的内容?
答案 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下有一个详细的规范。