【发布时间】:2012-04-30 09:25:35
【问题描述】:
我想知道,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 标签。
【问题讨论】:
-
>> 拜托,拜托,我喜欢 JavaScript,所以是的,我想处理这类事情。像“jQuery 为你处理这个”之类的答案不是我想要的
标签: jquery javascript dom elements children