⑵判断DOM中element对象的children属性是否存在,存在则直接返回element.children,不存在则执行兼容代码.
⑶兼容代码思路:
①创建一个数组elementArr以便返回最终 [符合要求] 的子节点集合。
②调用element对象的childNodes属性,以获取其子节点集合。
③遍历子节点集合,对每一个子节点进行判断,如果节点类型为1(即节点类型为元素节点),则添加到elementArr返回数组中。
④返回数组elementArr
在获取子元素之前js肯定不知道总共有多少个子元素,所以子元素都是以元素集合的形式出现的(即使子元素只有一个甚至没有),然后再从中枚举出每个子元素,比如:elem.childNodes[0] //这是第一个子元素
elem.childNodes[1] //这是第二个子元素,依此类推
此外,还可以使用children,它也是个集合,用法一样:
elem.children[0] //这是第一个子元素
elem.children[1] //这是第二个子元素,依此类推
childNodes和children的区别在于,前者会把文本元素(含回车、空格等)也作为子元素,后这则只把标签元素作为子元素
此外,如果知道子元素的ID、Name、Class或者标签名,也可以直接获取子元素,比如:
elem.getElementById("abc") //获取id为abc的子元素(ID具有唯一性,所以它可以直接获取)
elem.getElementsByName("xxx")[0] //获取name属性为xxx的第一个子元素(name属性允许重名,所以它是个集合)
elem.getElementsByClassName("hehe")[0] //获取class为hehe的第一个子元素(class属性也是可以重名的)
elem.getElementsByTagName("a")[0] //获取第一个a标签子元素
children是指元素的第一层子节点。
childNotes 也是指元素的第一层子节点,但是在高级浏览器中它还包括很多其它的类型,比如说文本节点等
所以说childNotes的到的子节点数要大与children的到的子节点说。比如说:
<ul><ol></ol>
<ol></ol>
</ul>
document.getElementsByTagName('ul')[0].children //2个子节点
document.getElementsByTagName('ul')[0].childNodes //5个子节点,包括2个元素节点,3个文本节点。