javascript - 关于DOM中Nodelist的问题
问题描述
问题:p的Nodelist的[2][4]所示的文本节点是什么?属于谁?<p>this is p<h1 id='h1'>this is H1</h1><h2>this is H2</h2> </p> <script type='text/javascript'>var p = document.getElementsByTagName('p')[0];var child_nodes = p.childNodes;var h1 = document.getElementsByTagName('h1')[0];for (var i=0;i<child_nodes.length;i++) { // 遍历这个Nodelist,并写入document文档中document.write(child_nodes[i]+'<br />')}获得p后,对p调用childNodes返回Nodelist集合并遍历它,得出图中的几个对象,[0]是p自身文本节点,[1],[3]是h1,h2元素节点,那其中的[2][4]的文本节点是什么?我当时以为是不是h1,h2的文本节点,毕竟childNodes是返回子节点的集合,但是代码推翻了我的想法。问题:p的Nodelist的[2][4]所示的文本节点是什么?属于谁?
alert(child_nodes[0]===p.childNodes[0]) // true p自身文本节点console.log(child_nodes[1]===h1)// true 子节点h1alert(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,对p进行childNodes返回的Nodelist集合包括h1,h2,而h1,h2的文本节点是在自己的Nodelist里。
问题解答
回答1:这两个文本节点就是</h1>、</h2>后面的空白符(换行符)。其实this is p后面也有一个,但这个空白符和字符串合在一起算一个文本节点。既然是p.childNodes搞出来的,肯定都属于p了。
如果是IE来解析这段代码,p.childNodes只有三个,分别是this is p、<h1 id='h1'>this is H1</h1>、<h2>this is H2</h2>;如果是其他浏览器,则会有5个子元素,换行或者元素之间有空格都会产生一个文本节点,也即是你所看到的情况。
你可以把换行符都删掉,写成这样,<p>this is p<h1 id='h1'>this is H1</h1><h2>this is H2</h2></p>,你就会看到只剩三个子元素了。
以上这些在《JS高程3》里都有描述,你去翻一翻看看,P269
回答2:elements 中的空白字元也會被視爲一文本節點, 所以
[0] = this is p (加上到h1前的空白)[1] = h1[2] = h1 和 h2 之間的空白[3] = h2[4] = h2 完結和 p 完結之間的空白
回答3:分别是h1和h2后面的换行符号,是属于p的文本节点。使用childNodes是会产生这样的问题的,因为这个方法也会将他们当作子元素。最好用children,可以避免这个问题。
相关文章:
1. python如何不改动文件的情况下修改文件的 修改日期2. angular.js - 不适用其他构建工具,怎么搭建angular1项目3. angular.js - Angular路由和express路由的组合使用问题4. python - django 里自定义的 login 方法,如何使用 login_required()5. java8中,逻辑与 & 符号用在接口类上代表什么意思6. mysql优化 - mysql count(id)查询速度如何优化?7. mysql主从 - 请教下mysql 主动-被动模式的双主配置 和 主从配置在应用上有什么区别?8. 主从备份 - 跪求mysql 高可用主从方案9. node.js - node_moduls太多了10. python - 关于ACK标志位的TCP端口扫描的疑惑?
