Web API节点操作
创始人
2024-04-29 13:29:03
0

1、节点概述

  • 网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示。
  • HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除。

        一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。  

  • 元素节点 nodeType 为 1
  • 属性节点 nodeType 为 2
  • 文本节点 nodeType 为 3(文本节点包含文字、空格、换行等)
  • 在实际开发者,节点操作主要操作的是元素节点

2、节点层级

利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。  

 

3、父级节点

node.parentNode

  • parentNode 属性可返回某节点的父节点,注意是最近的一个父节点
  • 如果指定的节点没有父节点则返回null 

Document
我是div
我是span
  • 我是li
  • 我是li
  • 我是li
  • 我是li
×

4、子节点

4.1、所有子节点

parentNode.childrenNodes (标准)

parentNode.childrenNodes 返回包含指定节点的子节点的集合,该集合为及时更新的集合。

注意:

  • 返回值里面包含了所有的子节点,包括元素节点、文本节点等。
  • 如果只想要获得里面的元素节点,则需要专门处理。所以我们一般不提倡使用childNodes

4.2、子元素节点

 parentNodes.children (非标准)

        parentNode.children 是一个只读属性,返回所有的子元素节点。它只返回子元素节点,其余节点不返回(重点掌握) 。虽然children是一个非标准,但是得到了各个浏览器的支持,因此可以放心使用。


Document
我是div
我是span
  • 我是li
  • 我是li
  • 我是li
  • 我是li
  1. 我是li
  2. 我是li
  3. 我是li
  4. 我是li
×

4.3、其他方法

方法名说明
parentNode.firstChild返回第一个子节点,找不到则返回null。同样,也是包含所有的节点
parentNode.lastChild返回最后一个子节点,找不到则返回null。同样,也是包含所有的节点
parentNode.firstElementChild返回第一个子元素节点,找不到则返回null。
parentNode.lastElementChild返回最后一个子元素节点,找不到则返回null。

        实际开发中,firstChild和lastChild包含其他节点,操作不方便,而firstElementChild和lastElementChild又有兼容性问题,那么我们如何获取第一个子元素节点或最后一个子元素节点呢? 

解决方案:

  • 如果想要第一个子元素节点,可以使用parentNode.children[0]
  • 如果想要最后一个子元素节点,可以使用parentNode.children[parentNode.children.length - 1]

Document
  1. 我是li1
  2. 我是li2
  3. 我是li3
  4. 我是li4
  5. 我是li5

5、案例:新浪下拉菜单

案例分析:

  • 导航栏里面的li都要有鼠标经过效果,所以需要循环注册鼠标事件
  • 核心原理:当鼠标经过li里面的,第二个孩子ul显示,当鼠标离开,则ul隐藏 

Document

6、兄弟节点

方法名说明
node.nextSibling返回当前元素的下一个兄弟节点,找不到则返回null。
node.previousSibling返回当前元素上一个兄弟节点,找不到则返回null。
node.nextElementSibling返回当前元素下一个兄弟元素节点,找不到则返回null
node.previousElementSibling返回当前元素上一个兄弟元素节点,找不到则返回null

注意:后面两个方法有兼容性问题,IE9以上才支持

解决兼容性问题,可以封装一个函数

   function getNextElementSibling(element) {var el = element;while (el = el.nextSibling) {if (el.nodeType === 1) {return el;}}return null;} 

Document
我是div
我是span

7、创建与添加节点

方法名说明

document.createElement('tagName')

创建由 tagName 指定的 HTML 元素。因为这些元素原先不存在。是根据我们的需求动态生成的,所以我们也称为 动态创建元素节点

node.appendChild(child)

将一个节点添加到指定父节点的子节点列表末尾。类似于CSS里面的after伪元素。
node.insertBefore(child, 指定元素)将一个节点添加到父节点的指定子节点前面。类似于CSS里面的before为元素。

Document
  • 123

8、案例:简单版发布留言

案例分析: 

  • 核心思路:点击按钮之后,就动态创建一个li,添加到ul里面
  • 创建li的同时,把文本域里面的值通过li.innerHTML赋值给li
  • 如果想要新的留言后面显示就用 appendChild如果想要前面显示就用insertBefore

Document

    9、删除节点

    方法名说明

    node.removeChild(child)

    从 node节点中删除一个子节点,返回删除的节点。
    
    Document
    
    • 熊大
    • 熊二
    • 光头强

    10、案例:删除留言

    案例分析: 

    1. 当我们把文本域里面的值赋值给li的时候,多添加一个删除的链接
    2. 需要把所有的链接获取过来,当我们点击当前的链接的时候,删除当前链接所在的li
    3. 阻止链接跳转需要添加JavaScript:void(0);或者 javascript:; 
    
    Document
    

      10、复制(克隆)节点

      方法名说明
      node.cloneNode()返回调用该方法的节点的一个副本。也称为克隆节点/拷贝节点

      注意:

      1. 如果括号参数为空或者为false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点。
      2. 如果括号参数为true,则是深度拷贝,会复制节点本身以及里面所有的子节点。
      
      Document
      
      • 1111
      • 2
      • 3

      11、案例:动态生成表格

      案例分析:

      1. 因为里面的学生数据都是动态的,我们需要js动态生成。这里我们模拟数据,自己定义好数据。数据我们采取对象形式1存储
      2. 所有的数据都是放在tbody里面的行里面
      3. 因为行很多,我们需要循环创建多个行(对应多少个人) 
      4. 每个行里面又有很多单元格(对应里面的数据),我们还继续使用循环创建多个单元格,并且把数据存入里面(双重for循环)
      5. 最后一列单元格是删除,需要单独创建单元格
      6. 最后添加删除操作,单击删除,可以删除当前行
      
      Document
      
      姓名科目成绩操作

       

      12、创建元素的三种方式

      • document.write()
      • element.innerHTML
      • document.createElement()

      区别:

      • document.write()是直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘
      • innerHTML是将内容写入某个DOM节点,不会导致页面全部重绘
      • innerHTML创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂
      • createElement() 创建多个元素效率稍低一点点,但是结构更清晰

      总结:不同浏览器下,innerHTML效率要比createElement高

      
      Document
      

      abc

      13、innerTHML和createElement效率对比

      innerHTML字符串拼接方式(效率低)

      
      效率测试
      
      
      

      createElement方式(效率一般)

      
      效率测试

      innerHTML数组方式(效率高)

      
      效率测试

      相关内容

      热门资讯

      前端-session、jwt 目录:   (1)session (2&#x...
      linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
      关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
      前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
      nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
      JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
      无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
      fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
      常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
      <C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...