关于DOM中Nodelist的问题

问题: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里。

阅读 3.8k
3 个回答

这两个文本节点就是</h1></h2>后面的空白符(换行符)。其实this is div后面也有一个,但这个空白符和字符串合在一起算一个文本节点。既然是div.childNodes搞出来的,肯定都属于div了。

如果是IE来解析这段代码,div.childNodes只有三个,分别是this is div<h1 id="h1">this is H1</h1><h2>this is H2</h2>;如果是其他浏览器,则会有5个子元素,换行或者元素之间有空格都会产生一个文本节点,也即是你所看到的情况。

你可以把换行符都删掉,写成这样,<div>this is div<h1 id="h1">this is H1</h1><h2>this is H2</h2></div>,你就会看到只剩三个子元素了。

以上这些在《JS高程3》里都有描述,你去翻一翻看看,P269

新手上路,请多包涵

elements 中的空白字元也會被視爲一文本節點, 所以

[0] = this is div (加上到h1前的空白)
[1] = h1
[2] = h1 和 h2 之間的空白
[3] = h2
[4] = h2 完結和 div 完結之間的空白

新手上路,请多包涵

分别是h1h2后面的换行符号,是属于div的文本节点。
使用childNodes是会产生这样的问题的,因为这个方法也会将他们当作子元素。
最好用children,可以避免这个问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题