当前位置: 首页 > 知识库问答 >
问题:

获取子节点的最佳方法

芮朗
2023-03-14

我想知道,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

这是表单的情况,或

var child = elem.childNodes; // treat as NodeList
var child = elem.firstChild;

据我所知,firstchild使用子节点中的NodeList,而firstElementChil使用子节点。我的假设基于MDN参考:

childNode是对元素节点的第一个子元素的引用,如果没有子元素,则为null

我猜想,就速度而言,差异(如果有的话)几乎是零,因为firstElementChild实际上是对children[0]的引用,而且children对象已经在内存中了。

我想到的是childNodes对象。我用它来查看表格元素中的表单。当children列出所有表单元素时,childNodes似乎还包含HTML代码中的空白:

console.log(elem.childNodes[0]);
console.log(elem.firstChild);

两个日志

console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);

所有日志

回到我最初的问题,我的猜测是:如果我想要最全面的对象,childNodes是最好的选择,但由于它的全面性,它可能不是最可预测的,因为它在任何给定时刻返回我想要/期望的元素。在这种情况下,跨浏览器支持可能也是一个挑战,尽管我可能错了。

谁能澄清一下手头物品之间的区别?如果有速度差异,不管有多小,我也想知道。如果我认为这一切都是错的,请随意教育我。

PS:拜托,拜托,我喜欢JavaScript,所以是的,我想处理这类事情。像“jQuery为您处理此问题”这样的答案不是我想要的,因此没有jQuery标记。


共有3个答案

艾敏学
2023-03-14

跨浏览器的方法是使用childNodes获取NodeList,然后使用nodeTypeELEMENT\u节点创建所有节点的数组。

/**
 * Return direct children elements.
 *
 * @param {HTMLElement}
 * @return {Array}
 */
function elementChildren (element) {
    var childNodes = element.childNodes,
        children = [],
        i = childNodes.length;

    while (i--) {
        if (childNodes[i].nodeType == 1) {
            children.unshift(childNodes[i]);
        }
    }

    return children;
}

http://jsfiddle.net/s4kxnahu/

如果您使用的是一个实用程序库,如lodash:

/**
 * Return direct children elements.
 *
 * @param {HTMLElement}
 * @return {Array}
 */
function elementChildren (element) {
    return _.where(element.childNodes, {nodeType: 1});
}

未来:

您可以将querySelectorAll:scope伪类结合使用(匹配作为选择器参考点的元素):

parentElement.querySelectorAll(':scope > *');

在编写本:范围在Chrome、Firefox和Safari中受支持。

郝冥夜
2023-03-14

firstElementChild可能在IE中不可用

关于IE

我的解决方案

child=(elem.firstElementChild | | elem.firstChild)

这将给第一个孩子甚至在IE上

陆昊
2023-03-14

听起来你想得太多了。您已经观察到childNodeschildrendes之间的区别,即childNodes包含所有节点,包括完全由空格组成的文本节点,而children只是作为元素的子节点的集合。这就是一切。

这两个集合都没有什么不可预测的,尽管有几个问题需要注意:

  • IE

childrenfirstElementChild和朋友只是方便的工具,提供了仅限于元素的DOM过滤视图。

 类似资料:
  • 问题内容: 我想知道,JavaScript提供了多种方法来从任何元素中获取第一个子元素,但是哪种方法最好呢?最好的意思是:在行为方面,大多数跨浏览器兼容,最快,最全面且可预测。我用作别名的方法/属性的列表: 这适用于两种情况: 在表单或迭代的情况下。如果我可能遇到文字元素: 据我所知,使用来自的NodeList ,并使用。我将这一假设基于MDN参考: 是对元素节点的第一个子元素的引用,或者如果不存

  • 本文向大家介绍ztree获取当前选中节点子节点id集合的方法,包括了ztree获取当前选中节点子节点id集合的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了ztree获取当前选中节点子节点id集合的方法。分享给大家供大家参考。具体分析如下: 要求:获取当前选中节点的子节点id集合。 步骤: 1.获取当前节点 2.用ztree的方法transformToArray()获取当前选中节点(

  • 本文向大家介绍JS 获取HTML标签内的子节点的方法,包括了JS 获取HTML标签内的子节点的方法的使用技巧和注意事项,需要的朋友参考一下 子节点的个数: 注意: 标签开/闭合算2个节点 第几个子几点: 示例: 这里是 length-4 处,margin-left:20px 输出:length=8 实例: 以上就是小编为大家带来的JS 获取HTML标签内的子节点的方法的全部内容了,希望对大家有所帮

  • 目前正在尝试ScalaFX。 设想如下: 我有一些节点,它们由一些边连接。 我更喜欢的是类似于 如何在JavaFX中检测特定点的节点? 或 JavaFX 2.2在坐标处获取节点(可视化树点击测试) 这些问题基于JavaFX的旧版本,并使用了不推荐的方法。 到目前为止,我还没有在ScalaFX8中找到任何替代或解决方案。有没有一个很好的方法来获得一定半径内的所有节点?

  • 这是一个有点宽泛的问题。我正在构建一个带有node和express的stripe服务器,并使用react前端对其进行攻击。我已经把基本的api,在那里我可以创建客户,保存支付方法和访问帐户编辑,更新等。 通过Stripe自己推荐的包收集支付方式的详细信息,该包保护PPI以使其符合政府关于隐私的规定。 现在我正在尝试保护rest api,以便只有经过验证的个人才能访问apiendpoint。例如,我