问题:div的Nodelist
的[2][4]
所示的文本节点是什么?属于谁?
<div>this is div
<h1 id="h1">this is H1</h1>
<h2>this is H2</h2>
</div>
<script type="text/javascript">
var div = document.getElementsByTagName("div")[0];
var child_nodes = div.childNodes;
var h1 = document.getElementsByTagName("h1")[0];
for (var i=0;i<child_nodes.length;i++) { // 遍历这个Nodelist,并写入document文档中
document.write(child_nodes[i]+"<br />")
}
获得div
后,对div
调用childNodes
返回Nodelist
集合并遍历它,得出图中的几个对象,[0]
是div
自身文本节点,[1],[3]
是h1,h2
元素节点,那其中的[2][4]
的文本节点是什么?我当时以为是不是h1,h2
的文本节点,毕竟childNodes
是返回子节点的集合,但是代码推翻了我的想法。
问题:div的Nodelist
的[2][4]
所示的文本节点是什么?属于谁?
alert(child_nodes[0]===div.childNodes[0]) // true div自身文本节点
console.log(child_nodes[1]===h1) // true 子节点h1
alert(child_nodes[1].childNodes===h1.childNodes) // true h1的childNodes返回的集合相同,符合遍历出的元素
alert(child_nodes[2].nodeValue===h1.childNodes[0].nodeValue) // false
alert(child_nodes[2]===h1.childNodes[0]) // false
想想也觉得不会是h1,h2的Nodelist,对DIV进行childNodes返回的Nodelist集合包括h1,h2,而h1,h2的文本节点是在自己的Nodelist里。
这两个文本节点就是
</h1>
、</h2>
后面的空白符(换行符)。其实this is div
后面也有一个,但这个空白符和字符串合在一起算一个文本节点。既然是div.childNodes搞出来的,肯定都属于div了。你可以把换行符都删掉,写成这样,
<div>this is div<h1 id="h1">this is H1</h1><h2>this is H2</h2></div>
,你就会看到只剩三个子元素了。以上这些在《JS高程3》里都有描述,你去翻一翻看看,P269