说明单独将子节点这一节单独拿出来记录的原因:在学习和实际开发中,发现了一些问题,为避免遗忘或在以后开发中造成疑惑,故将这一块单独记录。
1.childNodes
childNodes 是一个只读的类数组对象( NodeList 对象),它是某一个节点的子节点的实时表示。
需要注意的是,这里面有一些坑。
<body><ul><li></li><li></li></ul></body>
对这个 html 片段, 使用 childNodes 得到 ul 的子节点的个数为2,但是在下面这个html片段中,
<body>
<ul>
<li></li>
<li></li>
</ul>
</body>
IE 6 - IE 8 得到的子节点个数为 2 ,而 IE 高版本浏览器及其它浏览器中会得到子节点个数为5,因为这些浏览器将html片段里面的空格当成了文本节点。
为避免在使用时出错,所以一般 childNodes 与 noteType 一起使用。
2. nodeType
nodeType表示一个节点的类型。
- 9 Document节点
- 1 Element节点
- 3 Text节点
- 8 Comment节点
- 11 DocumentFragmet节点
在使用 childNodes 时,为避免选错元素,一般两个一起使用,如
var oUl = document.getElementsByTagName('ul')[0];
var aLi = oUl.childNodes;
for(var i= 0; i < aLi.length; i++){
if(aLi[i].nodeType == 1){
......
}
else{
......
}
}
3. firstChild 、lastChild
表示某一个节点的第一个和最后一个子节点,当这一个节点没有子节点时返回null。
这两个属性与childNodes属性有一样的问题,所以使用时也应当小心,最好也是跟nodeType一起使用。
4. firstElementChild 、lastElementChild
可以使用这个代替firstChild 、lastChild,这样就不会将文本节点参杂进来。但是需要注意的是,这俩方法不兼容低版本IE。
5. children
Text和Coment节点没有children属性,所以children属性只包含Element对象,所以可以使用它来代替childNodes,并且可以轻易的避免不必要节点的混入。
但是目前主流开发中,貌似很少看到有使用children属性,不知道是不是有什么问题还是大家都不习惯使用,可能本人信息比较落后而已哈。
6. 其它
本文所述均假设 开发过程只需要使用Element节点,当有情况于此相悖时,可适当甄别或做其它参考,详细参考可见 https://www.w3.org/TR/ElementTraversal/ 。
参考文献
【1】 《JavaScript权威指南第六版》
【2】 https://www.w3.org/TR/ElementTraversal/