我想知道,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
使用 NodeList from childNodes
,并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为你处理这个”之类的答案不是我想要的,因此没有查询 标签。