当前位置:   article > 正文

JavaScript 关于节点(记录学习)_javascript 节点

javascript 节点

目录

1.JavaScript中什么是节点?

1.1元素节点(element node):

1.2文本节点(text node):

1.3属性节点(attribute node):

2.节点对象的属性

3.获取节点对象元素方法

下面举例

3.1:getElementById(id)//根据ID获取元素

3.2:getElementsByTagName(tag)//按标记名(标签名)获取元素

 3.3:getElementsByName(name)//按名称获取元素

3.4:getAttribute(attributeName)//根据标签属性获取元素

3.5:setAttribute(attribute,value)//根据属性获取元素来修改或是添加该属性的值

 3.6:removeAttribute(name)//移除属性

4.节点处理方法

4.1:生成节点

4.2:插入和添加节点 

4.3:复制节点

4.4:删除和替换节点


1.JavaScript中什么是节点?

在DOM中,每个容器,独立的元素或文本块都被看作为一个节点,节点是W3C DOM的基本构建块。当一个容器包含另一个容器时,对应节点之间有父子关系(父节点,子节点)。同时该节点数遵循HTML的结构化本质,如<html>元素包含<head>、<boyd>,前者又包含<title>,后者包含各种块元素等。DOM中定义了HTML文档中6中相关节点类型。所有支持W3C DOM的浏览器(IE5+,Mozl和Safari等)都实现了前三种常见的类型,其中Mozl实现了所有类型。

节点类型表
节点类型数值节点类型附加说明实例
1元素(Element)HTML标记(标签)元素<h1>……</h1>
2属性(Attribute)HTML标记元素的属性<h1 color="red">……</h1>
3文本(Text)被HTML标记括起来的文本<h1>Hello HTML</h1>
8注释(Comment)HTML注释<!--Comment-->
9文档(Document)HTML文档根文本对象<html>
10文档类型(Document Type)文档类型<!DOCTYPE HTML PUBLIC"……">

1.1元素节点(element node):

  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title></title>
  5. </head>
  6. <body>
  7. <h1></h1>
  8. <ul>
  9. <li>JavaScript</li>
  10. <li>JavaScript</li>
  11. <li>JavaScript</li>
  12. <li>JavaScript</li>
  13. </ul>
  14. <!--
  15. 在节点树中,每个元素对象构成一个节点。元素可以包含其他元素。
  16. 所有的列表项元素<li>都包含在无序列表元素<ul>内部。
  17. 其中节点树中<html>元素是节点树的根节点-->
  18. </body>
  19. </html>

1.2文本节点(text node):

元素节点构成树的枝条,而文本节点构成树的叶子。

  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title></title>
  5. </head>
  6. <body>
  7. <p>你好<em>朋友</em>们!</p>
  8. <!--
  9. 包含"你好","朋友","们"三个文本节点。
  10. 文本节点总是包含在元素节点的内部。
  11. 但并非所有的元素节点都包含或直接包含文本节点,
  12. 如元素节点例:
  13. ul元素节点不包含任何文本节点,
  14. 而是包含另外的元素节点。
  15. 后者包含文本节点。
  16. 所以说,有些元素节点只是间接性包含了文本节点。
  17. -->
  18. </body>
  19. </html>

1.3属性节点(attribute node):

  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title></title>
  5. </head>
  6. <body>
  7. <h1 id="h1"></h1>
  8. <h2 class="cl1"></h2>
  9. <h3 align="center"></h3>
  10. <!--
  11. id和class也是属于属性
  12. 注意:并非所有的元素都包含属性,但所有的属性都包含在元素里。
  13. -->
  14. </body>
  15. </html>

2.节点对象的属性

节点属性表
节点属性附加说明
nodeName返回当前节点姓名
nodeValue返回当前节点的值(仅对文本节点)
nodeType返回当前节点的类型数值
parenNode引用当前节点的父节点(存在的话)
childNodes访问当前节点的子节点集合(存在的话)
firstChild对标记的子节点集合中第一个节点引用
lastChild对标记的子节点集合中最后一个节点引用
previousSibling对同属一个父节点的前一个兄弟节点引用
nextSibling对同属一个父节点的下一个兄弟节点引用
attributes返回当前节点(标记)属性的列表
ownerDocument指向包含节点(标记)的HTML document对象

案例:

  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title></title>
  5. </head>
  6. <body>
  7. <input type="text" id="ip">你好</input>
  8. <input type="button" value="查看节点姓名/值/类型值" id="btn1">
  9. <script>
  10. function $(id) {
  11. return document.getElementById(id);
  12. }
  13. //获取节点
  14. $("btn1").onclick = function() { //匿名函数绑定到btn的点击事件中
  15. let ip = $("ip");
  16. alert("节点名:" + ip.nodeName +
  17. "\n" + "节点值:" + ip.nodeValue + //只对文本节点生效,返回空
  18. "\n" + "父节点:" + ip.parentNode + //无父节点的情况下,默认为body。
  19. //返回(HTMLBody文档对象)
  20. "\n" + "子节点:" + ip.childNodes + //返回一个子节点列表。childNodes[下标]精确指定
  21. "\n" + "第一个节点:" + ip.firstChild + //不存在返回null
  22. "\n" + "最后一个节点:" + ip.lastChild + //不存在返回null
  23. "\n" + "前一个兄弟节点:" + ip.previousSibling +
  24. //为什么input前一个节点都已经是body了
  25. //还返回 text对象?
  26. //换行在文档中也算是文本。
  27. "\n" + "节点下一个兄弟节点:" + ip.nextSibling + //和上面同理
  28. "\n" + "返回当前节点:" + ip.attributes + //返回当前节点的属性列表
  29. "\n" + "节点对象:" + ip.ownerDocument //文档Object
  30. );
  31. }
  32. </script>
  33. </body>
  34. </html>

3.获取节点对象元素方法

对象方法是脚本给该对象的命令,可以有返回值,也可没有,且不是每个对象都有办法定义。DOM中定义了操作节点的一些列有效方法。(说人话就是开发JavaScript的大佬已经封装好,直接调用就行了。)
说明:getElementss返回的皆为伪数组(其实就是数组,因为都要遍历)

下面举例

3.1:getElementById(id)//根据ID获取元素

通过id属性值的定位元素对象(id不能重复)
基本语法:getElementById(id);

  1. <body>
  2. <p id="gm">早上好!我的朋友们!</p>
  3. <script>
  4. function show() {
  5. let a = document.getElementById("gm"); //DOM中的方法要带document.
  6. a.style.color = "red"; //可以设置样式
  7. a.innerText = "晚上好";
  8. document.write(typeof a);//返回为Object(对象)
  9. }
  10. show(); //调用方法
  11. /*
  12. 封装方法方便调用(传个ID就行了)
  13. function $(id){
  14. return document.getElementById(id);
  15. }
  16. */
  17. </script>
  18. </body>

typeof运算符用于获取类型信息。返回值有六种:
number(数值),string(字符),boolean(布尔),object(对象)
function(函数),undefined(空或是未定义)

3.2:getElementsByTagName(tag)//按标记名(标签名)获取元素

该方法返回文档(HTML)里指定的标签tag的元素数组。
简单语法:getElementByTagName("标签名");//封装不需要带"",传参需要;

  1. <body>
  2. <p ">早上好!我的朋友们!</p>
  3. <p ">中上好!我的朋友们!</p>
  4. <p ">晚上好!我的朋友们!</p>
  5. <p ">昨天好!我的朋友们!</p>
  6. <p ">明天好!我的朋友们!</p>
  7. <p ">后天好!我的朋友们!</p>
  8. <p ">好的!我的朋友们!</p>
  9. <script>
  10. function show() {
  11. let a = document.getElementsByTagName("p"); //DOM中的方法要带document.
  12. //遍历数组a
  13. for (let i = 0; i < a.length; i++) {
  14. a[i].style.color = "red";
  15. document.write(typeof a+"<br>");
  16. //br换行
  17. }
  18. }
  19. show(); //调用方法
  20. </script>
  21. </body>

 3.3:getElementsByName(name)//按名称获取元素

简单语法:getElementsByName("标签name属性的值");
相对id属性,<form>、<select>等元素节点更适合name属性,这时就需要getElementsByName()方法定位。

HTML元素 

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <script src="js/1.js"></script>
  7. </head>
  8. <body>
  9. <form action="">
  10. <input type="checkbox" name="Love" value="吃">
  11. <input type="checkbox" name="Love" value="喝">
  12. <input type="checkbox" name="Love" value="玩">
  13. <input type="checkbox" name="Love" value="乐">
  14. <br>
  15. <input type="button" value="全选" id="btn1">
  16. <input type="button" value="取消全选" id="btn2">
  17. <input type="button" value="反选" id="btn3">
  18. </form>
  19. </body>
  20. </html>

外部JavaScript

  1. function $(id){
  2. return document.getElementById(id);
  3. }
  4. function $Nname(name){
  5. return document.getElementsByName(name);
  6. }
  7. window.onload=function(){//写在窗体加载事件中
  8. function btn1(){//匿名函数
  9. let Love=$Nname("Love");//获取name为"Love"单选框按钮
  10. //遍历返回的数组
  11. for (let i = 0; i < Love.length; i++) {
  12. Love[i].checked=true;//设置为选中
  13. }
  14. }
  15. function btn2(){
  16. let Love=$Nname("Love");
  17. for (let i = 0; i < Love.length; i++) {
  18. Love[i].checked=false;//设置为不选中
  19. }
  20. }
  21. $("btn1").onclick=btn1;//绑定给全选
  22. $("btn2").onclick=btn2;//绑定取消全选
  23. //这边再写一个反选函数。直接id定位元素绑定点击事件再匿名函数
  24. $("btn3").onclick=function(){
  25. let Love=$Nname("Love");
  26. for (let i = 0; i < Love.length; i++) {
  27. if(Love[i].checked==false){//判断如果为false就为true
  28. Love[i].checked=true;
  29. }
  30. else{//否则为false
  31. Love[i].checked=false;
  32. }
  33. }
  34. }
  35. }

3.4:getAttribute(attributeName)//根据标签属性获取元素

该方法返回目标对象指定属性名称的某个属性值。
简单语法:getAttribute("属性名");

  1. <body>
  2. <div id="d1" title="你好!">
  3. 来自五湖四海的朋友们!
  4. </div>
  5. <script>
  6. let a=document.getElementById("d1");
  7. document.write(a.getAttribute("title"));
  8. </script>
  9. </body>

效果: 
 

 说明:为什么"你好"在下面?
因为HTML是遵循从上到下的原则来加载代码的。script代码块在元素块下面,所以"你好"会出现在元素块下面。

3.5:setAttribute(attribute,value)//根据属性获取元素来修改或是添加该属性的值

简单语法:setAttribute("属性名","需要修改或是添加的属性值");
get读取,那set就是写入咯。方法字面意思"写入属性值"也可以修改。但是属性不存在的话,无法对属性进行值的写入或是修改

  1. <body>
  2. <div id="d1" title="你好!">
  3. 来自五湖四海的朋友们!
  4. </div>
  5. <script>
  6. //通过ID定位到元素
  7. let a=document.getElementById("d1");
  8. //通过setAttribute方法修改值
  9. //注意:属性存在才能对其进行修改或是添加操作
  10. a.setAttribute("title","您们好!");
  11. //输出d1元素的title属性值
  12. document.write(a.getAttribute("title"));
  13. </script>
  14. </body>

效果: 

 3.6:removeAttribute(name)//移除属性

简单语法:removeAttribute("属性名");
删除任意元素节点指定的属性。

  1. <body>
  2. <div id="d1" align="center">
  3. 来自五湖四海的朋友们!
  4. </div>
  5. <script>
  6. //通过ID定位到元素
  7. let a=document.getElementById("d1");
  8. a.removeAttribute("align");
  9. //可以发现d1中的文本已经不再居中。
  10. //align属性已被删除
  11. </script>
  12. </body>

效果: 

4.节点处理方法

由于文本节点具有易于操作、对象明确等特点, DOM Level 1提供了非常丰富的节点处理方法。
 

节点处理方法表
操作类型方法原型附加说明
生成节点createElement(tagName)创建由tagName指定类型的标记
createTextNode(srting)创建包含字符串string的文本节点
createAttribute(name)创建属性
createComment(string)创建由字符串string指定的文本注释
插入和添加节点appendChild(newChild)添加子节点newChild到目标节点
insertBefore(newChild,targetChild)将新节点newChild
复制节点cloneNode(bool)复制节点本身,由逻辑bool确定是否复制子节点
删除和替换节点removeChild(childName)删除由childName指定
replaceChild(newChild,oldChild)用新节点newChild替换旧节点oldChild

接下来对以上方法进行逐一举例: 

4.1:生成节点

4.1.1:createElement(tagName);//创建标签节点
简单语法:createElement("标签名");

  1. <body>
  2. <div id="d1" align="center">
  3. 来自五湖四海的朋友们!
  4. </div>
  5. <script>
  6. //创建一个p标签
  7. let p=document.createElement("p");
  8. document.write(p.nodeName);//输出
  9. //发现已经创建了
  10. </script>
  11. </body>

效果图: 

 

4.1.2:createTextNode(string);//创建文本节点 
简单语法:create TextNode("需要创建的文本");

  1. <body>
  2. <div id="d1" align="center">
  3. 来自五湖四海的朋友们!
  4. </div>
  5. <script>
  6. //创建一个文本节点
  7. let p=document.createTextNode("这是关于节点处理方法!");
  8. //输出
  9. document.write("该节点的值:"+p.nodeValue+"<br>");
  10. document.write("该节点的姓名:"+p.nodeName);
  11. </script>
  12. </body>

效果: 

4.1.3:createAtturibute(name);//创建属性
简单语法:createAtturibute("属性名")

  1. <body>
  2. <div id="d1">
  3. 来自五湖四海的朋友们!
  4. </div>
  5. <script>
  6. function $(id) {
  7. return document.getElementById(id);
  8. }
  9. //变量保存创建属性方法
  10. let ag = document.createAttribute("align");
  11. //进行属性赋值
  12. ag.value = "center";
  13. //添加进标签中
  14. $("d1").setAttributeNode(ag);
  15. //扩展一下
  16. /*
  17. setAttributeNode(意为写入属性节点)
  18. 配合创建属性使用
  19. 简单语法:
  20. setAttributeNode(属性变量或是直接把方法写在里面也可以);
  21. */
  22. </script>
  23. </body>

效果图: 这里已经居中

4.1.4:createComment(string);//创建文本注释(不常用,大家就看看就行了) 
简单语法:createComment("文本");

  1. <body>
  2. <div id="d1">
  3. 来自五湖四海的朋友们!
  4. </div>
  5. <script>
  6. function $(id) {
  7. return document.getElementById(id);
  8. }
  9. let ag = document.createComment("aaaaaaaaa");
  10. console.log(ag); //控制台输出(F12);
  11. </script>
  12. </body>

4.2:插入和添加节点 

4.2.1:appendChild(newChild);//添加子节点到目标节点中
简单语法:目标节点.appendChild(子节点);

  1. <body>
  2. <div id="d1">
  3. 来自五湖四海的朋友们!
  4. </div>
  5. <script>
  6. function $(id) {
  7. return document.getElementById(id);
  8. }
  9. //首先创建标签节点
  10. let ag = document.createElement("p");
  11. ag.innerText = "记得先创建标签节点";
  12. //添加节点
  13. $("d1").appendChild(ag);
  14. </script>
  15. </body>

效果图: 

 4.2.2:insertBefore(newChild,targetChild);//将新节点插入到目标targetChild之前。意思就是将新的插入的目标节点的前面。比如评论区:最新的评论会在最上面。
简单语法:父节点.insertBefore(新节点,目标节点)

  1. <body>
  2. <div id="d1">
  3. <p id="p" style="color: aqua;">我是被替代一号位的子节点</p>
  4. 来自五湖四海的朋友们!
  5. </div>
  6. <script>
  7. function $(id) {
  8. return document.getElementById(id);
  9. }
  10. //首先创建标签节点
  11. let ag = document.createElement("p");
  12. ag.innerText = "我是新的子节点";
  13. ag.style.color = "red"
  14. //添加节点
  15. //在目标节点的前面插入;
  16. //父节点.insertBefore(新节点,目标节点);
  17. $("d1").insertBefore(ag, $("p"));
  18. </script>
  19. </body>

效果: 

4.3:复制节点

  4.3.1:clone(bool);//复制节点本身,由bool值确定是否复制子节点(true是,false否)
简单语法:clone(true或是false)

  1. <body>
  2. <div id="d1" style="background-color: red;width: 200px;height: 100px;margin-top: 20px;" >
  3. <p id="p" style="color: aqua;">我是子节点</p>
  4. 来自五湖四海的朋友们!
  5. </div>
  6. <script>
  7. function $(id) {
  8. return document.getElementById(id);
  9. }
  10. let d1f=$("d1").cloneNode(false);//不复制子节点
  11. let d1t=$("d1").cloneNode(true);//复制子节点
  12. //文档body(直接定位到HTML中的body)
  13. document.body.appendChild(d1f);
  14. document.body.appendChild(d1t);
  15. </script>
  16. </body>

效果: 可以看到原本的div已经到了下面,说明每次插入元素都是从上往下
 

4.4:删除和替换节点

  4.4.1:removeChild(childName);//删除由ChildName(子节点名称)指定的节点;
简单语法:父节点.ChildName(指定删除节点的名称);
说明:div的父节点是body。(表示为document.body);

  1. <body>
  2. <div id="d1" style="background-color: red;width: 200px;height: 100px;margin-top: 20px;">
  3. <p id="p" style="color: aqua;">我是子节点</p>
  4. 来自五湖四海的朋友们!
  5. </div>
  6. <script>
  7. function $(id) {
  8. return document.getElementById(id);
  9. }
  10. let a = $("d1"); //指定父节点
  11. //父节点.removeChild(需要移除的子节点);
  12. //a.removeChild($("p"));//通过id
  13. a.removeChild(document.getElementsByTagName("p")[0]); //通过标签姓名数组
  14. //还有其他获取元素的方法就不一样举例了
  15. </script>
  16. </body>

4.4.2:replaceChild(newChild,oldChild);//删除由(子节点名称)指定的节点;
用新节点(newChild)替换旧节点(oldChild);
简单语法:父节点.replaceChild(新节点,旧节点);

  1. <body>
  2. <div id="d1" style="background-color: red;width: 200px;height: 100px;margin-top: 20px;">
  3. <p id="p" style="color: aqua;">我是子节点</p>
  4. 来自五湖四海的朋友们!
  5. </div>
  6. <script>
  7. function $(id) {
  8. return document.getElementById(id);
  9. }
  10. let a = $("d1"); //获取父节点节点
  11. let b = $("p"); //替换节点
  12. let c = document.createElement("p") //创建新的标签节点
  13. c.innerText = "我是替换节点";
  14. //父节点.replaceChild(新节点,替换的旧节点)
  15. a.replaceChild(c, b);
  16. </script>
  17. </body>

补充两个方法:

1:document.querySelector();
简单来说就是根据选择器获取整个页面匹配的元素;
直接上案例

  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title></title>
  5. </head>
  6. <style>
  7. #d1 {
  8. background-color: red;
  9. width: 200px;
  10. height: 100px;
  11. margin-top: 20px;
  12. }
  13. #p {
  14. color: aqua;
  15. }
  16. #u1 {
  17. display: inline-block;
  18. }
  19. </style>
  20. <body>
  21. <div id="d1">
  22. <p id="p">
  23. 我是p节点的文本
  24. <ul id="u1">
  25. <li>我是第1个li</li>
  26. <li>我是第2个li</li>
  27. <li>我是第3个li</li>
  28. <li>我是第4个li</li>
  29. <li>我是第5个li</li>
  30. </ul>
  31. </p>
  32. 来自五湖四海的朋友们!
  33. </div>
  34. <script>
  35. //通过选择器方法定位到id为d1的元素
  36. let a = document.querySelector("#d1");
  37. a.style.display = "inline-block";
  38. //输出一下
  39. console.log(a.innerText);
  40. </script>
  41. </body>
  42. </html>

 

document.querySelector("可以配合其他选择器使用,后代/类/子元素");

  1. </style>
  2. <body>
  3. <div id="d1">
  4. <p id="p">
  5. 我是p节点的文本
  6. <ul id="u1">
  7. <li>我是第1个li</li>
  8. <li>我是第2个li</li>
  9. <li>我是第3个li</li>
  10. <li>我是第4个li</li>
  11. <li>我是第5个li</li>
  12. </ul>
  13. </p>
  14. 来自五湖四海的朋友们!
  15. </div>
  16. <script>
  17. //通过选择器方法定位到id为d1>ul>li的元素
  18. let a = document.querySelector("#d1>ul>li");
  19. a.style.display = "inline-block";
  20. //输出一下
  21. console.log(a.innerText);
  22. </script>
  23. </body>
  24. </html>

 这里大家应该发现了一个问题,明明有五个li元素怎么只返回了第一个li元素。这是因为document.querySelector();只返回一个匹配元素。如果要多个返回需要用到下面这个方法。

2:document.querySelectorAll();
根据选择器获取多个页面元素元素。返回一个节点集合(伪数组);
直接看案例:

  1. <body>
  2. <div id="d1">
  3. <p id="p">
  4. 我是p节点的文本
  5. <ul id="u1">
  6. <li>我是第1个li</li>
  7. <li>我是第2个li</li>
  8. <li>我是第3个li</li>
  9. <li>我是第4个li</li>
  10. <li>我是第5个li</li>
  11. </ul>
  12. </p>
  13. 来自五湖四海的朋友们!
  14. </div>
  15. <script>
  16. //通过选择器方法定位到id为d1>ul>li的元素
  17. let a = document.querySelectorAll("#d1>ul>li");
  18. //输出一下//返回的数组需要遍历
  19. for (let i = 0; i < a.length; i++) {
  20. a[i].style.display = "inline-block";
  21. console.log(a[i].innerText);
  22. }
  23. </script>
  24. </body>

 

 

 到这就算是记录完毕了。感谢大家的阅读。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/113255?site
推荐阅读
相关标签
  

闽ICP备14008679号