之前遍历子元素可以用childNodes属性或者firstChild进行遍历,但是要判断子元素是否是ELement元素。
后来W3C通过Element Traversal规定定义了一组新的属性来进行遍历,就不用判断了,非常方便。
childNodes属性遍历
遍历子元素通常是通过childNodes属性进行遍历,但是这个属性会包含空白节点,如果只是要遍历Element元素就特别不方便。
请看如下代码示例:
1<div class="article"> 2 <p>段落一</p> 3 <p>段落二</p> 4 <p>段落三</p> 5</div> 6 7<script type="text/javascript"> 8 let childList = document.querySelector(".article").childNodes; 9 console.log(childList); 10 // 控制台输出: 11 // NodeList(7) [text, p, text, p, text, p, text] 12</script>
控制台查看效果:

获取到的子元素包含了空白的text节点,这些节点就是一些换行、缩进、空格等。
如果要遍历 childList 中p元素,实务中也经常是这样,那么需要判断子元素为Element类型:
1let childList = document.querySelector(".article").childNodes; 2// 遍历子元素 3childList.forEach((item, index) => { 4 if (item.nodeType == 1) { // 判断是Element类型 5 console.log(item); 6 } 7}); 8 9// 控制台输出: 10// 3个p元素
Element系列属性遍历
Element Traversal为DOM元素添加了5个属性:
11. childElementCount 子元素的个数(nodeType=1)。 22. firstElementChilde 指向第一个Element类型的子元素。 33. lastElementChilde 指向最后一个Element类型的子元素。 44. previousElementSibling 指向上一个同胞Element类型的元素。 55. nextElementSibling 指向下一个同胞Element类型的元素。
通过这些新属性,遍历Element元素起来就方便多了,还是以上面为例:
1// 获取第一个元素 2let currentElement = document.querySelector(".article").firstElementChild; 3// 遍历子元素 4while (currentElement) { 5 console.log(currentElement); 6 // 获取下一个元素 7 currentElement = currentElement.nextElementSibling; 8}
这样处理起来就更加简洁了。
目前IE9及以上版本,以及所有现代浏览器都支持这些属性。
