how2j.cn

关键字 简介 示例代码
节点关系图
示例代码
parentNode
父节点关系
示例代码
previousSibling
nextSibling
同胞节点关系
示例代码
childNodes
子节点关系
示例代码
childNodes
children
childNodes和children的区别
示例代码
示例 1 : 节点关系图   
示例 2 : 父节点关系   
示例 3 : 同胞节点关系   
示例 4 : 子节点关系   
示例 5 : childNodes和children的区别   

假设html代码如实例中,那么各个元素节点的关系如下:
d1 d2 d3 的parentNode是parentDiv
parentDiv的firstNode是 d1
parentDiv的lastNode是d3
d2的previousSibling是d1
d2的nextSibling是d3
parentDiv的children是 d1 d2 d3
运行效果
节点关系图
<div id="parentDiv"> <div id="d1">第一个div</div> <div id="d2">第二个div</div> <div id="d3">第三个div</div> </div>
<div id="parentDiv">
 <div id="d1">第一个div</div>
 <div id="d2">第二个div</div>
 <div id="d3">第三个div</div>
</div>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
通过parentNode获取父节点。
本例中从id=d1的div开始递归获取其父节点,分别获取如下父节点
DIV[id=parentDiv] -> body->html->document
运行效果
<html> <body> <script> var node = null; function showParent(){ if(null==node) node = document.getElementById("d1"); if(document == node) alert("已是根节点:document"); else{ alert(node.parentNode); node = node.parentNode; } } </script> <div id="parentDiv"> 父Div的内容 <div id="d1">第一个div</div> <div id="d2">第二个div</div> <div id="d3">第三个div</div></div> <button onclick="showParent()">不断递归d1的父节点</button> </body> </html>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 3 :

同胞节点关系

edit
分别通过 previousSiblingnextSibling属性获取前一个,以及后一个同胞节点。
在本例中,首先获取d2元素节点
通过previousSibling获取前一个节点d1.
注意 d1和d2标签是紧挨着的,所以d2前一个节点是d1。
通过nextSibling 获取后一个节点#text.
注意 d2和d3不是紧挨着 标签之间有任何字符、空白、换行都会产生文本元素。 所以获取到的节点是#text.
运行效果
<script> function showPre(){ var d2 = document.getElementById("d2"); alert(d2.previousSibling.innerHTML); } function showNext(){ var d2 = document.getElementById("d2"); alert(d2.nextSibling.nodeName); } </script> <div id="parentDiv"> 父Div的内容 <div id="d1">第一个div</div><div id="d2">第二个div</div> <div id="d3">第三个div</div></div> <button onclick="showPre()">获取d2的前一个同胞</button> <button onclick="showNext()">获取d2的后一个同胞</button>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
子节点关系有:
firstChild 第一个子节点
lastChild 最后一个子节点
childNodes 所有子节点
注:firstChild 如果父节点的开始标签和第一个元素的开始标签之间有文本、空格、换行,那么firstChild第一个子节点将会是文本节点,不会是第一个元素节点
注:lastChild 和firstChild同理。 在本例中故意让第3个元素的结束标签与div的结束标签紧挨着,所以最后一个子节点就是第三个标签
注: 子元素个数一共是6个。 因为parentDiv的子节点是 文本节点接着一个元素节点,重复3次。 所以一共是6个。
运行效果
<script> function showfirst(){ var div = document.getElementById("parentDiv"); alert(div.firstChild.nodeName); } function showlast(){ var div = document.getElementById("parentDiv"); alert(div.lastChild.nodeName); } function showall(){ var div = document.getElementById("parentDiv"); alert(div.childNodes.length); } </script> <div id="parentDiv"> 父Div的内容 <div id="d1">第一个div</div> <div id="d2">第二个div</div> <div id="d3">第三个div</div></div> <button onclick="showfirst()">第一个子节点</button> <button onclick="showlast()">最后一个子节点</button> <button onclick="showall()">所有子节点数量</button>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果
示例 5 :

childNodes和children的区别

edit
childNodeschildren都可以获取一个元素节点的子节点。
childNodes 会包含文本节点
children 会排除文本节点
运行效果
<div id="parentDiv"> <div id="d1">第一个div</div> <div id="d2">第二个div</div> <div id="d3">第三个div</div></div> <button onclick="showNumber1()">通过childNodes获取子节点总数</button> <button onclick="showNumber2()">通过children()获取子节点总数</button> <script> function showNumber1(){ alert(document.getElementById("parentDiv").childNodes.length); } function showNumber2(){ alert(document.getElementById("parentDiv").children.length); } </script>
<div id="parentDiv">
 <div id="d1">第一个div</div>
 <div id="d2">第二个div</div>
 <div id="d3">第三个div</div></div>

<button onclick="showNumber1()">通过childNodes获取子节点总数</button>

<button onclick="showNumber2()">通过children()获取子节点总数</button>

<script>

function showNumber1(){
  alert(document.getElementById("parentDiv").childNodes.length);
}

function showNumber2(){
  alert(document.getElementById("parentDiv").children.length);
}

</script>


源代码
1. 双击选中单词 2. 三击选中整行 3. CTRL+F 查找 4. F8 全屏编辑,再次点击恢复
渲染中 渲染完成
效果


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2024-07-27 关于 childNodes 子节点的理解
虚心求学




所谓子节点,无非包含两类:元素子节点、文本子节点。 1.所谓元素节点,指的是以一个元素标签开头到结尾所形成的完整节点。 比如: <div></div> 又比如: <div> div内部的文本 </div> 上面两个元素整个都属于 元素节点,无论元素标签内部含文字与否, 仅根据元素标签<>开头到</>结尾 判定为一个元素节点(就算有文字,也归为元素节点内部的文本,不单独列出)。 <br/> <img/> <input> 这些特殊元素,虽然未包含封闭标签,但也算一个完整的 封闭的元素了,也同样归为元素节点。 2.所谓文本节点,指的是 没有被标签所包含的文本内容, 比如: <div></div>文本节点1 又比如:<div> div 内部的文本 <div>文本节点2 上面的 “文本节点1” 和 “文本节点2” 由于,这两个文本没有被任何标签所包围,故都属于文字节点。 注意:上面的 “ div 内部的文本 ”是父节点的 “子元素节点 div ” 的 “文本节点”, 而不应该列为“子文本节点”,应该是“孙子文本节点”。 即 parent.childNodes 中包含 div,但不包含 div 内部的内容, 因为 div 内部的文本也一并归为 子元素节点div 中。 绕晕了的话,可以粗暴一点, 判断一个元素所包含的子文本节点, 直接看这个文本是否被任何标签所包围,没有的话就属于子文本节点。 比如 <parent><div> div 内部的文本 <div>文本节点</parent> 这里直接用 parent 标签来表示 父元素(可以是div、span、table 等等)。 “div内部的文本” 不属于 parent 的子节点(实际是孙子节点),而 “文本节点” 就属于 parent 的子节点。 但是要特别注意这种情况: <parent> <div></div> </parent> 请问这里有几个子元素节点,几个子文本节点? 如果你回答,只有1个子元素节点,没有子文本节点,那么恭喜你中招了。 <parent> => <parent> ¬换行 <div></div> 等价于: <div></div> ¬换行 </parent> => </parent> 等价于: <parent> => <parent>\r\n <div></div> 等价于: <div></div>\r\n </parent> => </parent> 因此正确答案是,parent 有 一个子元素节点(div) 有 “两个” 子文本节点 “\r\n”。parent的first和lastchidNode 都是 文本节点。 当然这个 \r\n 实际并不存在,我只是表达一个换行的意思, 但是 获取 parent 的子节点 的的确确会 获取到这两个子文本节点。 总结一下:子元素节点以parent内部的 元素标签< ></ >形成的封闭元素作为一个子元素。 当然<br/>、<input> 这种不需要写封闭标签的特殊元素也属于一个完整的子元素。 而没有被任何标签所包围的 文本内容 就属于一个文本节点,无论文本内容是空格、换行与否。 练习一下: 题目1: <div id="parent"><input><br/><img src="123.png"></div> 请问以id 为 parent 的容器div中,共有几个子节点? 题目2: <div id="parent"><span><p><a href="#nowhere">www.baidu.com</a><br/></p></span></div> 请问以id 为 parent 的容器div中,共有几个子元素节点,几个子文本节点? 题目3: <div id="parent"> <br/></div> 请问以id 为 parent 的容器div中,共有几个子元素节点,几个子文本节点?
题目1:
<div id="parent"><input><br/><img src="123.png"></div>

请问以id 为 parent 的容器div中,共有几个子节点?


题目2:
<div id="parent"><span><p><a href="#nowhere">www.baidu.com</a><br/></p></span></div>

请问以id 为 parent 的容器div中,共有几个子元素节点,几个子文本节点?


题目3:

<div id="parent">
<br/></div>

请问以id 为 parent 的容器div中,共有几个子元素节点,几个子文本节点?
答案
练习1:
3个子节点,分别是 INPUT、BR、IMG。第一个子节点为“INPUT”,最后一个为“IMG”

练习2:
1个子节点为SPAN,属于元素节点,不存在子文本节点。第一个子节点和最后一个子节点均是 SPAN;

练习3:
两个子节点,其中包含一个子元素节点(BR),一个子文本节点(换行文本)。
第一个子节点为 BR 最后一个子节点为 #Text


2 个答案

虚心求学
答案时间:2024-07-27
简言之,html 这个标签很特殊,只会先找到两个子节点 即 head 和body。 无论你在html标签内写多少个元素、多少个文本、换行,最后html也只有两个子节点(head 和 body), 就算你 一个都不写 html 也会默认加上两个子节点(head 和 body)。 比如你这样写: <html id="parent"></html> html 似乎 不包含任何子元素,不包含任何子节点,但实际上 测试结果仍然是 html 有两个子节点,head 和body。 就是这么顽强,哈哈。 测试代码见下面。

虚心求学
答案时间:2024-07-27
很有意思的是,对于 html 标签,处理子节点的方式不一样。 <html id="parentDiv"> <head> <title>DOM lesson</title> </head> <body> <h1>DOM lesson</h1> <p>Hello world!</p> </body> </html> html 的子节点只有两个,分别是head和body,直接忽略了所有的文本节点,包括换行和空格。 更有意思的是,把html改成div,结果又不一样 于是下面的代码: <div id="parentDiv"> <head> <title>DOM lesson</title> </head> <body> <h1>DOM lesson</h1> <p>Hello world!</p> </body> </div> 结果: id = parentDiv 的 div容器,共有 7 个子节点。从先到后依次是: 节点1:#Text 节点2:title 节点3:#Text 节点4:h1 节点5:#Text 节点6:p 节点7:#Text 也就是说,直接把 head 标签 和 body 标签 直接忽略了,既不是子元素节点也不是子文本节点。 原因: 由于div 内 声明 html 和 body 是错误的,包含的关系弄反了, div 正常来说应该是 包含在 body 中,而body 又包含在 html 中。 因此对于这个错误的标签直接忽略,既不认为是元素,也不认为是文本, 相当于 这两个 html 和 body 直接被抠掉了。 和删去 <html></html> <body></body> 这两个标签的结果是等价的。 也就是说代码: <div id="parentDiv"><head><title>DOM lesson</title></head><body><h1>DOM lesson</h1><p>Hello world!</p></body></div> 上面的代码是都在一行上,没有换行(这里虽然显示会自动换行)。 结果: id = parentDiv 的 div容器,共有 3 个子节点,全是元素节点,不含文本节点。从先到后依次是: 节点1:title 节点2:h1 节点3:p 可以用我下面的代码检验一下。



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2020-08-27 什么是文本节点
一叶秋梦




什么是文本节点
childNodes和children都可以获取一个元素节点的子节点。 
childNodes 会包含文本节点 
children 会排除文本节点 

							


2 个答案

福清平头哥
答案时间:2023-01-11
就是文字,这边指的是标签外面的文字,因为标签里面的文字被算在标签节点里面了

ercilan
答案时间:2020-10-28
<p>123</p> 1243 1243就是文本节点,没有啥东西,就纯文本。 123是元素p的innerHtml



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2019-11-06 上面例子
2019-06-09 父节点关系 递归应该修改
2018-11-16 第二个示例为什么点击很多次才是根节点?谁给分析一下?


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 5 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 前端部分-HTML DOM-节点关系 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图