我在想,JavaScript提供了多种方法来获取任何元素的第一个子元素,但哪个是最好的呢?通过“最好”,我指的是:在跨浏览器兼容性、速度、全面性和行为方面最可靠。以下是我使用的方法/属性别名列表:
var elem = document.getElementById('container');
var child = elem.children[0];
var child = elem.firstElementChild; // == children[0]
这对两种情况都适用:
var child = elem.childNodes[0]; // or childNodes[1], see below
那是针对表单或 <div>
迭代的情况。如果我可能遇到文本元素:
var child = elem.childNodes; // treat as NodeList
var child = elem.firstChild;
据我所知,firstChild
使用来自 childNodes
的 NodeList,而 firstElementChild
使用 children
。我基于 MDN 参考文献得出这个假设:
就速度而言,我猜想差异(如果有的话)几乎不存在,因为
childNode
是元素节点的第一个子元素的引用,如果没有子元素,则为null
。
firstElementChild
实际上是 children[0]
的引用,而 children
对象已经在内存中了。令我困惑的是
childNodes
对象。我使用它来查看表格元素中的表单,但是 children
列出了所有表单元素,而 childNodes
似乎还包括 HTML 代码中的空白符:console.log(elem.childNodes[0]);
console.log(elem.firstChild);
两者日志记录 <TextNode textContent="\n ">
console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);
所有的日志 <input type="text"
…>
。为什么?我理解一个对象可以让我使用原始的HTML代码,而另一个对象则依附于DOM,但似乎 childNodes
元素在两个层次上都能工作。回到我的最初问题,我的猜测是:如果我想要最全面的对象,则
childNodes
是正确的选择,但是由于其全面性,在任何给定时刻返回我想要/期望的元素可能不太可预测。在这种情况下,跨浏览器支持可能也会成为挑战,尽管我可能是错的。有人能澄清手头对象之间的区别吗?如果有速度差异,无论多么微不足道,我也想知道。如果我看错了,请随时指出。
PS:请务必留下 JavaScript,所以是的,我想处理这种事情。像“jQuery为您处理此事”这样的答案不是我要找的,因此没有 jquery 标签。
children
是在IE 4中诞生的,比成为标准或被其他浏览器采用早了十年,你可以认为IE <= 8是正确的,而其他浏览器是错误的。 - Tim Down.children
上使用for in
循环会导致意外的结果,因为子对象上有命名键。即length
和__proto__
。可能显而易见,但它让我困惑了一段时间... - shennanNodeList
是一个类似数组的对象,一些浏览器(如FF)作为JS和DOM API超集的一部分实现了自定义对象。但重点是:如果它是类似数组的实例,请勿使用for...in
,或者使用for (p in inst) { if (inst.hasOwnProperty(p)) { /* do stuff */}}
过滤循环。 - Elias Van Ootegem