DOM学习之节点与节点属性节点方法

目录

1.节点层级

1.2.节点

(1)常用节点

(2)其他节点

1.3节点树

 2.节点(Node)类型

2.1属性

(1)nodeType属性

(2)nodeName属性

(3)nodeValue属性

(4)textContent属性

(5)nextSibling属性

(6)previousSibling属性

(7)parentNode属性

(8)parentElement属性

(9)firstChild&lastChild

(10)childNodes属性

3.方法

(1)appendChild()

(2)insertBefore()

(3)removeChild()

(4)replaceChild()


DOM(Document Object Model)文档对象模型,是JS操作网页的接口。用于将网页转为一个JS对象,从而可以用脚本进行各种操作(比如增删内容)。

文档:表示的就是整个的HTML网页文档

对象:表示将网页中的每一个部分都转换为了一个对象。

模型:表示对象之间的关系,这样方便我们获取对象

文档对象模型(DOM)是网页的编程接口。它给文档(结构树)提供了一个结构化的表述并且定义了一种方式——程序可以对结构树进行访问,以改变文档的结构,样式和内容。

1.节点层级

任何 HTML 或 XML 文档都可以用 DOM 表示为一个由节点构成的层级结构。节点分很多类型,每种类型对应着文档中不同的信息和标记,有自己不同的特性、数据和方法,而且与其他类型有某种关系。这些关系构成了层级,让标记可以表示为一个以特定节点为根的树形结构

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Hello DOM</title>
</head>
<body>
  <p>Hello DOM</p>
</body>
</html>

 在 XML 文档中,则没有这样预定义的元素,任何元素都可能成为文档元素。

1.2.节点

DOM的最小组成单位叫做节点(node)。

节点的类型有七种:Document、DocumentType、Element、Text、Comment、DocumentFragment。

(1)常用节点

  文档节点(document):整个HTML文档document对象作为window对象的属性存在的,可以直接使用。

元素节点(Element):HTML文档中的HTML标签。

 属性节点(Attribute):元素的属性,即标签中的属性,这里要注意的是属性节点并非是元素节点的子节点,而是元素节点的一部分。

 文本节点(Text):标签中的文本内容。    

(2)其他节点

DocumentType:doctype标签(比如<!DOCTYPE html>)。

 Comment:注释 

 DocumentFragment:文档的片段 

这七种节点都属于浏览器原生提供的节点对象的派生对象,具有一些共同的属性和方法。

1.3节点树

一个文档的所有节点,按照所在的层级,可以抽象成一种树状结构。这种树状结构就是DOM。文档的树形结构(DOM树),就是由各种不同类型的节点组成。每个节点可以看作是文档树的一片叶子。

上面案例的节点数,如图:

除了根节点以外,其他节点对于周围的节点都存在三种关系。DOM提供操作接口,用来获取三种关系的节点。

父节点关系(parentNode):直接的上级节点。

子节点关系(childNode):直接的下级节点。子节点接口包括firstChild(第一个子节点)和lastChild(最后一个子节点)等属性

同级节点关系(sibling)拥有同一父节点的节点。同级节点接口包括nextSibling(紧邻在后的那个同级节点)和previousSibling(紧邻在前的那个同级节点)属性。

 2.节点(Node)类型

DOM Level1描述了名为Node的接口,这个接口是所有DOM节点类型都必须实现的。Node接口在 JavaScript中被实现为Node类型,在除 IE之外的所有浏览器中都可以直接访问这个类型。在 JavaScript中,所有节点类型都继承Node类型,因此所有类型都共享相同的基本属性和方法。

2.1属性

(1)nodeType属性

作用:表示节点的类型

节点类型
文档节点(document) 9
元素节点(Element) 1
属性节点(Attr) 2
文本节点(Text) 3
文档类型节点(DocumentType) 10
注释节点(Comment) 8
文档片段节点(DocumentFragment) 11
  <div id="div1"></div>
  <script>
    console.log(document.nodeType);//9
    console.log(div1.nodeType);//1
  </script>

(2)nodeName属性

作用:返回节点的名称

  <div id="div1">hello world</div>
  <script>
    var div = document.getElementById('div1');
    console.log(div.nodeName); //DIV
    console.log(div.firstChild.nodeName); //#text
  </script>

(3)nodeValue属性

作用:可读写当前节点本身的文本值。只有文本节点、注释节点和属性节点有文本值

  <div id="div1">hello world</div>
  <script>
    var div = document.getElementById('div1');
    console.log(div.nodeValue); // null
    // 读
    console.log(div.firstChild.nodeValue); //hello world
    // 写
    div.firstChild.nodeValue = '123';
   console.log(div.firstChild.nodeValue);//123
</script>

(4)textContent属性

作用:返回当前节点和它的所有后代节点的文本内容

  <div id="div1">Hello <span><span>World </span>JavaScript</span> DOM</div>
  <script>
    var div = document.getElementById('div1');
    console.log(div.textContent); //Hello World JavaScript DOM
  </script>

(5)nextSibling属性

作用:返回紧跟当前节点后面的第一个同级节点。如果没有返回null


  <div id="div1">hello</div>
  <div id="div2">world</div>
  <script>
    var d1 = document.getElementById('div1');
    var d2 = document.getElementById('div2');
    console.log(d1.nextSibling); //#text "\n  " 没有得到预想的结果是因为第二个div换行了,紧跟当前节点的第一个同级节点不再是第二个div  
    console.log(d1.nextSibling === d2); // false
  </script>

  <div id="div1">hello</div><div id="div2">world</div>
  <script>
    var d1 = document.getElementById('div1');
    var d2 = document.getElementById('div2');
    console.log(d1.nextSibling); //<div id="d2">world</div>
    console.log(d1.nextSibling === d2); // true
  </script>

(6)previousSibling属性

作用:返回当前节点前面的、距离最近的一个同级节点。如果没有返回null

<div id="div1">hello</div><div id="div2">world</div>
<script>
  var d1 = document.getElementById('div1');
  var d2 = document.getElementById('div2');
  console.log(d1.previousSibling); //<div id="div1">hello</div>
  console.log(d1.previousSibling === div1); // true
</script>

(7)parentNode属性

作用:返回当前节点的父节点。它的父节点只可能是三种类型:元素节点、文档节点和文档片段节点

<div id="d1">hello world</div>
<script>
  var div1 = document.getElementById('d1');
  console.log(div1.parentNode); // body
</script>

(8)parentElement属性

作用:返回当前节点的父元素节点。如果当前节点没有父元素节点,则返回null

  <div id="d1">hello world</div>
  <script>
    var div1 = document.getElementById('d1');
    console.log(div1.parentElement); // <body>
    //设置父元素的样式属性
    div1.parentElement.style.color= 'red';
  </script>

(9)firstChild&lastChild

作用:返回当前节点的第一个/最后一个子节点,如果当前节点没有子节点,则返回null

  <div id="d1">子节点1<div>div</div></div>
  <script>
    var div1 = document.getElementById('d1');
    console.log(div1.firstChild); // #text "子节点1"
    console.log(div1.lastChild); // <div>
  </script>

(10)childNodes属性

作用:返回当前节点的所有子节点,返回结果为数组类型

  <div id="d1">子节点1<div>div</div></div>
  <script>
    var div1 = document.getElementById('d1');
    console.log(div1.childNodes); //NodeList [ #text, div ]
  </script>

3.方法

(1)appendChild()

作用:添加子节点。用于将接受的节点对象作为最后一个子节点,插入当前节点

传入参数:节点对象                      返回值:插入文档的子节点

<body id="box">
  <script>
     // 创建元素节点p
     var p = document.createElement('p');
     // 向p标签插入内容
     p.innerHTML = '我是一个p标签';
     // 将节点插入到body中
     document.body.appendChild(p);
     //查看body的所有子节点,验证是否插入成功
     res = document.getElementById('box');
     console.log(res.childNodes);//NodeList(3) [ #text, script, p ]
   </script>
</body>

(2)insertBefore()

作用:用于将某个节点插入父节点内部的指定位置

var insertedNode = parentNode.insertBefore(newNode, referenceNode);

语法:insertBefore(newNode,referenceNode)      newNode&referenceNode传入的参数

newNode:表示所要插入的节点,插入的位置是referenceNode的前面       

referenceNode:当前节点的父节点内部的某个子节点

返回值:newNode

  <div id="div1">我是div1</div>
  <div id="div2">我是div2</div>
  <div id="div3">我是div3</div>
  <script>
    //创建一个p标签
    var newNode = document.createElement("p");
    // 向p标签插入内容
    newNode.innerHTML = '我是p标签'
    //parentNode.insertBefore(newNode, referenceNode);
    // 获取要插入位置的节点
    var refer = document.getElementById('div2') 
    // 获取父节点的引用
    var father = refer.parentNode
    // 插入节点
    father.insertBefore(newNode,refer)
   </script>

(3)removeChild()

作用:接受一个子节点作为参数,用于从当前节点移除该子节点

返回值:移除的子节点

 //移除div2 
 <div id="div1">我是div1</div>
  <div id="div2">我是div2</div>
  <div id="div3">我是div3</div>
  <script>
    // 获取要删除的节点的引用
    var refer = document.getElementById('div2')
    // 获取删除的节点的父节点的引用
    var father = refer.parentNode
    // 删除该子节点
    father.removeChild(refer)
   </script>

(4)replaceChild()

作用:用于将一个新的节点,替换当前节点的某一个子节点

语法: parentNode.replaceChild(newNode, replaceNode)

replaceNode:要替换的节点

newNode:用于替换的新节点

parentNode:要替换的节点的父节点

  //替换div2
  <div id="div1">我是div1</div>
  <div id="div2">我是div2</div>
  <div id="div3">我是div3</div>
  <script>
    // 创建一个p标签
    var p = document.createElement('p');
    // 向P标签插入内容
    p.innerHTML = '我是一个p标签'
    // 获取要替换的节点的引用
    var replace = document.getElementById('div2')
    // 获取替换的节点的父节点的引用
    var father = replace.parentNode
    // 删除该子节点
    father.replaceChild(p,replace)
   </script>

注意:以上四个方法均需要对父节点对象进行调用 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340