前端(十四)——DOM节点操作手册:你需要了解的一切

news2024/11/23 2:27:15

在这里插入图片描述

🙂博主:小猫娃来啦
🙂文章核心:DOM节点操作手册:你需要了解的一切

文章目录

  • 前言
  • DOM基础知识
  • 操作现有节点
  • 创建新节点
  • 遍历节点树
  • 修改节点属性和样式
  • 事件处理
  • 实践应用
    • 动态创建表格
    • 动态更新列表

前言

DOM(文档对象模型)是一种用于表示和操作HTML、XML和SVG文档的编程接口。它将网页文档解析为一个由节点组成的树形结构,每个节点代表文档中的一个元素、属性、文本或其他内容。

DOM是很重要的,因为它让我们能够使用JavaScript等脚本语言直接操控网页内容,实现动态、交互性强的网页效果。通过DOM,我们可以改变网页的样式和结构,响应用户的操作,并且实现数据的动态加载和更新。这样就能够让网页更加生动有趣,提升用户体验。同时,DOM的标准化也保证了开发者在不同浏览器下的兼容性,使得开发更加便捷和可靠。

本文深层次就DOM的相关操作,展开论述。

DOM基础知识

  • 节点的类型
  • 元素节点(Element Node):表示HTML中的标签,例如<div><p><a>等。元素节点是文档树的主要成分,可以包含其他节点作为子节点。

  • 文本节点(Text Node):表示HTML标签中的文本内容。例如,在<p>标签中的一段文字就是文本节点。

  • 注释节点(Comment Node):表示HTML文档中的注释内容。注释节点以<!--开头,以-->结尾。

  • 属性节点(Attribute Node):表示HTML元素的属性。例如,classidsrc等属性都属于属性节点。

  • 文档节点(Document Node):表示整个HTML文档的根节点。在DOM树中,文档节点是所有其他节点的最高级父节点。

  • 文档片段节点(Document Fragment Node):表示一个独立的文档片段。文档片段节点可以包含其他节点,常用于临时存储和处理一系列节点。

  • 获取节点的手段

通过ID获取节点:可以使用getElementById()方法,传入元素的ID来获取对应的节点。例如:

var myElement = document.getElementById("myId");

通过类名获取节点:可以使用getElementsByClassName()方法,传入类名来获取所有具有相同类名的节点组成的集合。该方法返回一个类数组对象。例如:

var myElements = document.getElementsByClassName("myClass");

通过标签名获取节点:可以使用getElementsByTagName()方法,传入标签名来获取所有具有相同标签名的节点组成的集合。该方法返回一个类数组对象。例如:

var myElements = document.getElementsByTagName("div");

通过选择器获取节点:可以使用querySelector()querySelectorAll()方法来使用CSS选择器获取节点。querySelector()方法返回第一个匹配的节点,querySelectorAll()方法返回所有匹配的节点组成的集合。例如:

var myElement = document.querySelector("#myId");
var myElements = document.querySelectorAll(".myClass");

操作现有节点

我们通过操作DOM树来添加、删除和替换节点,从而动态修改网页的内容和结构。需要注意的是,这些方法都需要通过获取到相应的父节点才能进行操作。

  • 添加节点

appendChild():用于将一个新节点添加为目标节点的最后一个子节点。例如:

var parentElement = document.getElementById("parent");
var newElement = document.createElement("div");
parentElement.appendChild(newElement);

insertBefore():用于在目标节点的特定子节点之前插入一个新节点。例如:

var parentElement = document.getElementById("parent");
var targetElement = document.getElementById("target");
var newElement = document.createElement("div");
parentElement.insertBefore(newElement, targetElement);
  • 删除节点

removeChild():用于从父节点中移除指定的子节点。例如:

var parentElement = document.getElementById("parent");
var childElement = document.getElementById("child");
parentElement.removeChild(childElement);
  • 替换节点

replaceChild():用一个新节点替换目标节点的子节点。例如:

var parentElement = document.getElementById("parent");
var targetElement = document.getElementById("target");
var newElement = document.createElement("div");
parentElement.replaceChild(newElement, targetElement);

创建新节点

  1. createElement():使用指定的标签名创建一个新的元素节点。可以通过document.createElement()方法来实现。例如:
var newElement = document.createElement("div");

这将创建一个新的<div>元素节点。

  1. createTextNode():创建一个包含指定文本内容的新文本节点。可以通过document.createTextNode()方法来实现。例如:
var textNode = document.createTextNode("Hello, world!");

这将创建一个包含文本内容"Hello, world!"的文本节点。

  1. 其他创建方法:除了上述常用方法外,还有其他一些特定目的的创建方法。例如:
  • createDocumentFragment():创建一个空的文档片段节点。文档片段节点可以用来存储临时的DOM节点,然后一次性插入到文档中。
  • createAttribute():创建一个属性节点,用于为元素节点添加属性。
  • createComment():创建一个注释节点,用于在DOM中添加注释内容。

这些创建方法提供了灵活的方式来创建不同类型的节点,并根据需求灵活使用。


遍历节点树

A. parentNode 和 childNode:

  • parentNode:属性用于获取当前节点的父节点。通过访问该属性,我们可以获取到某个节点在DOM树中的直接父节点。
  • childNodes:属性返回一个包含所有子节点的集合,以类数组对象形式表示。注意,该集合包含所有类型的节点,包括元素节点、文本节点、注释节点等。

B. firstChild、lastChild、nextSibling、previousSibling:

  • firstChild:属性表示当前节点的第一个子节点,如果没有子节点则返回null。
  • lastChild:属性表示当前节点的最后一个子节点,如果没有子节点则返回null。
  • nextSibling:属性表示当前节点的下一个兄弟节点,即与当前节点具有相同父节点的相邻节点。
  • previousSibling:属性表示当前节点的上一个兄弟节点,即与当前节点具有相同父节点的前一个节点。

举几个例子,看起来直观一些:

var parentElement = document.getElementById("parent");

// 获取父节点
var parentNode = parentElement.parentNode;

// 获取子节点集合
var childNodes = parentElement.childNodes;

// 获取第一个子节点和最后一个子节点
var firstChild = parentElement.firstChild;
var lastChild = parentElement.lastChild;

// 遍历兄弟节点
var siblingNode = parentElement.firstChild;
while (siblingNode) {
    // 处理兄弟节点
    console.log(siblingNode);
    
    siblingNode = siblingNode.nextSibling;
}

修改节点属性和样式

通过设置属性和样式,我们可以动态地调整节点的特征,从而实现网页的动态效果。

修改属性:

  • setAttribute(name, value):设置节点的指定属性名为相应的值。例如:
var myElement = document.getElementById("myId");
myElement.setAttribute("class", "newClass");
  • 直接修改属性值:通过直接赋值的方式修改节点的属性值。例如:
var myElement = document.getElementById("myId");
myElement.className = "newClass";

修改样式:

  • 直接修改style属性:通过修改节点的style属性来设置具体的CSS样式。例如:
var myElement = document.getElementById("myId");
myElement.style.color = "red";
myElement.style.fontSize = "20px";

小栗子:

<!DOCTYPE html>
<html>
<head>
<style>
  .highlight {
    color: red;
    font-weight: bold;
  }
</style>
</head>
<body>
  <p id="myParagraph">Hello, world!</p>

  <script>
    var myElement = document.getElementById("myParagraph");
    
    // 修改属性
    myElement.setAttribute("class", "highlight");

    // 修改样式
    myElement.style.fontSize = "25px";
  </script>
</body>
</html>

事件处理

  • 添加事件监听器:
    addEventListener(event, handler):通过调用元素节点的addEventListener()方法来添加事件监听器。其中,event参数是事件类型,如"click"、"mouseover"等,handler参数是事件触发时执行的函数。例如:
var myButton = document.getElementById("myButton");
myButton.addEventListener("click", function() {
  // 处理点击事件的逻辑
  console.log("Button clicked!");
});
  • 事件冒泡和捕获:
    事件冒泡和捕获是DOM事件模型中的两个阶段。在事件冒泡阶段,事件从最具体的元素(例如被点击的按钮)向上级元素(例如包含该按钮的容器)传播;而在事件捕获阶段,事件则从上级元素向最具体的元素传播。在实践中,默认情况下,大多数事件都是在冒泡阶段进行处理。

举个栗子:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
  <button id="myButton">Click Me</button>

  <script>
    var myButton = document.getElementById("myButton");

    // 添加事件监听器
    myButton.addEventListener("click", function(event) {
      console.log("Button clicked!");

      // 阻止事件冒泡
      event.stopPropagation();
    });

    document.body.addEventListener("click", function() {
      console.log("Body clicked!");
    });
  </script>
</body>
</html>

我们给按钮元素添加了一个点击事件的监听器,当按钮被点击时,会输出"Button clicked!“。同时,我们还给页面的 body 元素添加了一个点击事件的监听器,当页面任意位置被点击时,会输出"Body clicked!”。这就是dom在事件处理中的魅力。


实践应用

动态创建表格

var table = document.createElement("table");

for (var i = 0; i < 3; i++) {
    var row = document.createElement("tr");

    for (var j = 0; j < 3; j++) {
        var cell = document.createElement("td");
        var cellText = document.createTextNode("Row " + i + ", Col " + j);

        cell.appendChild(cellText);
        row.appendChild(cell);
    }

    table.appendChild(row);
}

document.body.appendChild(table);

我们通过dom操作动态地创建了一个3x3的表格,并将其添加到了页面的 body 元素中。

动态更新列表

var list = document.createElement("ul");

for (var i = 0; i < 5; i++) {
    var item = document.createElement("li");
    var itemText = document.createTextNode("Item " + i);

    item.appendChild(itemText);
    list.appendChild(item);
}

document.body.appendChild(list);

我们创建了一个包含5个列表项的无序列表,并将其添加到页面的 body 元素中。

除了动态创建表格和更新列表之外,DOM还可以用于许多其他实际应用。例如:

  • 动态加载数据:通过JavaScript和DOM,可以实现异步加载数据并将其动态插入到网页中,从而实现动态内容的更新。

  • 实现动画效果:通过修改DOM节点的样式和位置,可以实现各种动画效果,如淡入淡出、滑动等。

  • 表单验证:可以使用DOM来获取表单元素的值,并进行验证和处理,以确保用户输入的准确性和完整性。

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/923651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能测试工具Jmeter你所不知道的内幕

谈到性能测试&#xff0c;大家一定会联想到Jmeter和LoadRunner,这两款工具目前在国内使用的相当广泛&#xff0c;主要原因是Jmeter是开源免费&#xff0c;LoadRunner 11在现网中存在破解版本。商用型性能测试工具对于中小型企业很难承担相关的费用。国内的性能测试工具有&#…

【Linux】一张图了解系统文件

首先先认识磁盘结构 系统文件分布图 文件查找 文件删除 文件的增删改查都是围绕inode来完成的&#xff0c;所以当我们要进行文件删除的时候&#xff0c;只需要通过inode来获取到它对应的block bitmap和inode bitmap数据块容器和保存文件属性的位置置为 0即可 &#xff0c;如果想…

Visual Studio 2022的MFC框架——WinMain函数

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Visual Studio 2022下开发工具的MFC框架知识。 大家还记得创建Win32应用程序是怎么弄的吗&#xff1f;Win32应用程序有一条很明确的主线&#xff1a;首先进入WinMain函数&#xff0c…

RK3568 安卓源码编译

一.repo安卓编译工具 项目模块化/组件化之后各模块也作为独立的 Git 仓库从主项目里剥离了出去&#xff0c;各模块各自管理自己的版本。Android源码引用了很多开源项目&#xff0c;每一个子项目都是一个Git仓库&#xff0c;每个Git仓库都有很多分支版本&#xff0c;为了方便统…

一种特殊的NC文件转TIF——知道每个像元的坐标值怎么转为TIF

之前写过一篇文章&#xff0c;介绍了NetCDF文件格式&#xff0c;并详细讲解了如何使用Python对NetCDF文件进行读写操作&#xff0c;进而介绍了NetCDF文件的地理参考&#xff0c;最后以两个数据为例讲解了怎么将NetCDF格式的数据转GeoTIFF格式的数据。 但是上次介绍的NC文件的地…

1212页Kubernetes学习指南,几乎涵盖所有K8S核心技术点,建议收藏!

Kubernetes&#xff08;简称K8S&#xff09;是一个开源的容器编排平台&#xff0c;主要用于自动化部署、扩展和管理容器化应用程序。由于K8S在容器编排方面的优势&#xff0c;它已经成为了现代化应用程序部署和管理的事实标准 因此&#xff0c;对于运维人员来说&#xff0c;学…

数电票红利悄然而至 百望云数据驱引“供应链协同”新纪元

2023年&#xff0c;全面数字化的电子发票政策正如飞驰的列车在各地试点推广中加速前行&#xff0c;“以数治税”的全新时代即将来临&#xff0c;基于数电票赋能的企业数字化红利正在悄然释放。借着政策快速落地的东风&#xff0c;财税数字化也进入到全面建设的新周期&#xff0…

打造B2B2C商城系统成功的关键要素有哪些?

电子商务的蓬勃发展&#xff0c;B2B2C商城系统成为了越来越多企业的选择。然而&#xff0c;在激烈的市场竞争中&#xff0c;要想打造一款成功的B2B2C商城系统并不容易。下面就B2B2C商城系统成功的关键要素作一些简单介绍&#xff0c;希望对大家有帮助(仅供参考)。 一、整合供应…

VIT 论文精读 | transformer架构引入CV的开创性工作

目录 1. 背景 2. 方法 2.1 怎么把2D图像变成1D序列输入到transformer中 像素&#xff1f; 先提取特征图&#xff1f; 打成多个patch 2.2 transformer和卷积网络比较 2.3 结构 1. 背景 VIT是基于transformer的在图像分类大放异彩的变体&#xff0c;transformer是VIT的亲…

LeetCode面试经典150题(day 2)

26. 删除有序数组中的重复项 难度:简单 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯…

【LeetCode-中等题】56. 合并区间

题目 题解一&#xff1a;排序 思路&#xff1a; 1、对数组按第一个元素大小进行排序&#xff0c;使得数组按大小连续排列 2、先将第一个数组提前放入list集合&#xff0c;因为肯定是从第一个开始算起的 3、接着对下一个数组的左边界和list集合最后一个元素的右边界对比&#x…

go学习之go的语法知识

文章目录 1.go语言开发注意事项2.golang常用的转义字符(escape char)3.golang开发常用的问题小结与提示&#xff1a; 4.go语言注释类型&#xff08;1&#xff09;.注释类型1&#xff09;行注释2&#xff09;块注释(多行注释) &#xff08;2&#xff09;使用细节&#xff1a;1&a…

CnetSDK .NET OCR SDK Crack

CnetSDK .NET OCR SDK Crack CnetSDK.NET OCR库SDK是一款高度准确的.NET OCR扫描仪软件&#xff0c;用于使用手写、文本和其他符号等图像进行字符识别。它是一款.NET OCR库软件&#xff0c;使用Tesseract OCR引擎技术&#xff0c;可将字符识别准确率提高99%。通过将此.NET OCR扫…

React原理 - React Virtual DOM 原理

目录 扩展学习资料 Virtual DOM 是什么【虚拟dom】 React渲染 Virtual DOM VS 原生DOM【vDom是否比原生Dom更高效】 Virtual DOM数据结构 Virtaual DOM Diff【虚拟dom前后比对&#xff0c;更新不同dom的算法】 源码解读 react源码组织方式&#xff1a; React Stack Rec…

2.含电热联合系统的微电网运行优化

含电热联合系统的微电网运行优化 MATLAB代码&#xff1a;含电热联合系统的微电网运行优化 关键词&#xff1a;微网 电热联合系统 优化调度 参考文档&#xff1a;《含电热联合系统的微电网运行优化》完全复现 仿真平台&#xff1a;MATLAB yalmipcplex [火]主要内容&#xf…

网络安全(黑客)自学剖析

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…

基于Jenkins CICD的代码发布与回滚-------从小白到大神之路之学习运维第87天

第四阶段提升 时 间&#xff1a;2023年8月24日 地 点&#xff1a;2304教室 授课人&#xff1a;李凤海 参加人&#xff1a;全班人员 内 容&#xff1a; 基于Jenkins CICD的代码发布与回滚 目录 一、案例概述 二、案例知识点 三、案例环境 &#xff08;一&#xff0…

C++类成员的访问权限以及类的封装

C通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限&#xff0c;它们分别表示公有的、受保护的、私有的&#xff0c;被称为成员访问限定符。所谓访问权限&#xff0c;就是你能不能使用该类中的成员。 Java、C# 程序员注意&#xff0c;C 中的 publ…

大数据-玩转数据-Flink时间滚动动窗口

一、说明 时间窗口包含一个开始时间戳(包括)和结束时间戳(不包括), 这两个时间戳一起限制了窗口的尺寸. 在代码中, Flink使用TimeWindow这个类来表示基于时间的窗口. 这个类提供了key查询开始时间戳和结束时间戳的方法, 还提供了针对给定的窗口获取它允许的最大时间戳的方法(m…

HTTP原理与实现

一、基本概念 一、基本原理* 1、全称&#xff1a; HyperText Transfer Protocol (超文本传输协议) 2、底层实现协议&#xff1a;建立在 TCP/IP 上的无状态连接。 3、基本作用&#xff1a;用于客户端与服务器之间的通信&#xff0c;规定客户端和服务器之间的通信格式。包括请…