parentNode,parentElement,childNodes,children最经典讲解

本文深入解析了DOM中的四大核心属性:parentNode, parentElement, childNodes 和 children 的功能及使用场景,详细介绍了它们之间的区别和联系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Dom树
首先了解parentNode,parentElement,childNodes,children四大属性之前,必须对Dom树有一定的了解,在Dom文档结构中,HTML页面每一部分都是由节点组成的,节点的类型一共有3种,元素节点,文本节点,属性节点,从图中可以看出属性节点属于元素节点的分支,一般不常考虑,
下来详细介绍,childNodes,childern,
childNodes指的是返回当前元素子节点的所有类型节点,其中连空格和换行符都会默认文本节点,
代码如下
这里写图片描述
打印结果:
这里写图片描述
其中空格和文本均打印为文本节点,这里有一个重点要说明一下!!!
之前说childNodes返回的是所有节点的数组,但是如果我给你li元素添加属性会发现元素的长度总长度并没有改变,也就是说在childNodes只会返回文本和元素的节点,并不能返回属性节点!!!
childern指的是返回当前元素的所有元素节点,代码如下

这里写图片描述
执行代码如下:
这里写图片描述
children很直观的反应了返回元素节点的属性。
接下来讲解:parentNode,parentElement,
parentNode:顾名思义-父节点
parentElement:顾名思义-父元素
两者在通常情况下都是一样的,因为包含元素的节点只有可能是元素节点,这里可能会有一个误区,有些人可能会想文本节点是否可以包含元素节点,来作为父节点,这里是不行的,文本节点只是文本本身,自身算一个节点,文本节点的父节点直接是元素节点。
那下面我们就说一下,parentNode,parentElement,的特例,
这里写图片描述
这里运行结果是一致的,他们的祖宗元素都是HTML,但是我们试着想一下,再往上一层,就是根部document了,并不是元素,我们可以一起来看一下下面的代码
这里写图片描述
执行代码如下:
这里写图片描述
这里的唯一区别就出来了,因为parentElement找的是元素,因此当找到根部document时候就是出现值为null的报错,而且parentNode找的是节点,当然就可以显示出来了!
以上是博主对Dom这四个原生的属性通过阅读网上的博客和文章总结出来的,希望可以帮助到正在学习javascript道路上的伙伴!!!

<think>我们正在讨论如何在JavaScript中获取一个元素的子元素数量。根据引用内容,有几个关键点需要注意: 1.使用`childNodes`属性会包含所有类型的子节点,包括文本节点(可能包含空白文本节点),所以直接使用`childNodes.length`可能得到比预期更多的节点数。 2.使用`children`属性则只包含元素节点,这通常是更常用的方法。 根据引用[2]和引用[3]:-引用[2]中使用了`parentElement.children`来获取子元素集合(只包含元素节点)。-引用[3]指出`childNodes`会包含文本节点,因此可能不是我们想要的。因此,推荐的方法是使用`children`属性,它返回一个只包含元素节点的`HTMLCollection`,然后我们可以通过`length`属性获取数量。 另外,引用[2]中还提供了一个自定义方法`indexOf_1`,用于获取元素在父元素的子元素集合中的索引,但这里我们只需要子元素的数量。 所以,获取一个元素的子元素数量的方法:1.首先获取该元素对象,例如:`letelement =document.getElementById('example');`2.然后使用`element.children.length`即可得到子元素的数量。注意:`children`属性是只读的,返回的是实时的`HTMLCollection`,当子元素变化时,集合也会变化。示例代码: ```javascript//获取id为'container'的元素letcontainer =document.getElementById('container'); //获取子元素数量letchildCount= container.children.length; console.log(childCount);``` 如果使用`childNodes`,则需要过滤非元素节点,例如: ```javascriptlet childNodes =container.childNodes;let elementCount =0; for(leti =0; i< childNodes.length; i++) {if (childNodes[i].nodeType===1){ //1代表元素节点elementCount++;} }console.log(elementCount); ```但显然,直接使用`children`属性更简洁。因此,总结:获取元素子节点数量的直接方法是使用`children.length`。相关问题:1.如何获取一个元素的第一个子元素? 2.如何判断一个节点是元素节点还是文本节点?3.在JavaScript中,如何遍历一个元素的所有子元素?</think>### JavaScript 获取元素子节点数量的方法 在 JavaScript 中获取元素的子节点数量,需要注意不同类型的节点处理方式。以下是核心方法总结: #### 1. 使用 `children` 属性(推荐) ```javascript const element = document.getElementById('parentElement'); const childCount = element.children.length; ``` - **特点**:仅计算**元素节点**(忽略文本节点、注释节点等) - **返回值**:`HTMLCollection` 类型,包含所有子元素节点 - **示例**: ```html <div id="container"> <p>Item 1</p> <span>Item 2</span> <!-- 注释节点 --> </div> <script> const container = document.getElementById('container'); console.log(container.children.length); // 输出:2(仅计算<p>和<span>) </script> ``` #### 2. 使用 `childNodes` 属性 ```javascript const nodeCount = element.childNodes.length; ``` - **特点**:计算**所有类型节点**(包括文本节点、注释节点等) - **返回值**:`NodeList` 类型 - **注意事项**: - 空白文本节点也会被计算(常见于代码格式化产生的换行符) - 需配合 `nodeType` 筛选元素节点: ```javascript const elementNodes = [...element.childNodes].filter( node => node.nodeType === Node.ELEMENT_NODE ).length; ``` #### 3. 使用 `querySelectorAll` 方法 ```javascript const directChildren = element.querySelectorAll(':scope > *').length; ``` - **特点**:精确获取**直接子元素**(忽略后代元素) - **优势**:支持 CSS 选择器筛选特定子元素 --- ### ⚠️ 关键区别总结 | 方法 | 包含节点类型 | 是否统计空白文本 | 返回类型 | |---------------|----------------------|------------------|----------------| | `children` | 仅元素节点 | ❌ | HTMLCollection | | `childNodes` | 所有节点 | ✅ | NodeList | | `querySelectorAll` | 仅元素节点 | ❌ | NodeList | > **佳实践**: > 需要纯元素数量 → 使用 `children.length` > 需要包含文本节点 → 使用 `childNodes.length` > 需要筛选特定子元素 → 使用 `querySelectorAll` --- ### 实际场景示例 **HTML 结构**: ```html <div id="list"> <!-- 标题 --> <h2>Items</h2> <ul> <li>Item 1</li> <li>Item 2</li> </ul> </div> ``` **JavaScript 获取**: ```javascript const listDiv = document.getElementById('list'); // 获取直接子元素数量 console.log(listDiv.children.length); // 输出:2(<h2>和<ul>) // 获取所有子节点数量 console.log(listDiv.childNodes.length); // 输出:5(包含文本节点和注释) ``` [^1]: 通过 `children` 属性可直接获取元素子节点集合 [^2]: `childNodes` 会包含所有类型节点需注意筛选 [^3]: 空白文本节点可能导致计数偏差 --- ### 相关问题 1. 如何区分 JavaScript 中的 `children` 和 `childNodes` 属性? 2. 在 DOM 操作中,如何精确获取某个元素的**第一个子元素节点**? 3. 当元素包含空白文本节点时,如何正确过滤只计算有效子元素? 4. `parentNode` 和 `parentElement` 在获取父节点时有什么区别?
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值