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数组方式(效率高)

      
      效率测试

      相关内容

      热门资讯

      【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
      银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
      不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
      AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
      Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
      AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
      北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
      AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
      月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
      ​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...