当前位置: 首页 > news >正文

【JavaScript】之文档对象模型(DOM)详解

JavaScript 的强大之处在于它能够与 HTML 和 CSS 交互,动态地修改网页内容和样式。而实现这一功能的核心就是 DOM(文档对象模型)

一、什么是 DOM?

DOM 是文档对象模型(Document Object Model)的缩写。它将 HTML 或 XML 文档转换成一个树形结构,JavaScript 可以访问和操作这棵树上的每一个节点,从而实现对网页的动态控制。

二、DOM 树的结构

DOM 树的结构是层级的,每个节点都有其父节点、子节点和兄弟节点。

  • 父节点 (Parent Node): 包含当前节点的节点。

  • 子节点 (Child Node): 被当前节点包含的节点。

  • 兄弟节点 (Sibling Node): 与当前节点拥有相同父节点的节点。

三、如何使用 JavaScript 操作 DOM?

1. 获取元素:

  • getElementById(): 通过 ID 获取元素。

let element = document.getElementById("myElement");
console.log(element); // 输出 id 为 "myElement" 的元素
  • getElementsByTagName(): 通过标签名获取元素集合 (HTMLCollection)。

let paragraphs = document.getElementsByTagName("p");
for (let i = 0; i < paragraphs.length; i++) {console.log(paragraphs[i]); // 输出所有 p 元素
}
  • getElementsByClassName(): 通过类名获取元素集合 (HTMLCollection)。

let elements = document.getElementsByClassName("myClass");
for (let i = 0; i < elements.length; i++) {console.log(elements[i]); // 输出所有 class 包含 "myClass" 的元素
}
  • querySelector(): 通过 CSS 选择器获取第一个匹配的元素。

let element = document.querySelector("#myElement > p");
console.log(element); // 输出 id 为 "myElement" 元素下的第一个 p 元素
  • querySelectorAll(): 通过 CSS 选择器获取所有匹配的元素集合 (NodeList)。

let elements = document.querySelectorAll(".myClass");
elements.forEach(element => console.log(element)); // 输出所有 class 包含 "myClass" 的元素

2. 修改元素内容:

  • textContent: 获取或设置元素的文本内容。

let element = document.getElementById("myElement");
element.textContent = "新的文本内容"; // 设置文本内容
console.log(element.textContent); // 输出 "新的文本内容"
  • innerHTML: 获取或设置元素的 HTML 内容 (慎用,可能存在安全风险)。

let element = document.getElementById("myElement");
element.innerHTML = "<p>新的 HTML 内容</p>"; // 设置 HTML 内容

3. 修改元素属性:

  • getAttribute(): 获取元素的属性值。

let element = document.getElementById("myElement");
let src = element.getAttribute("src");
console.log(src); // 输出 src 属性的值
  • setAttribute(): 设置元素的属性值。

let element = document.getElementById("myElement");
element.setAttribute("src", "new_image.jpg"); // 设置 src 属性的值
  • removeAttribute(): 移除元素的属性。

let element = document.getElementById("myElement");
element.removeAttribute("src"); // 移除 src 属性

4. 修改元素样式:

  • style 属性: 直接访问和修改元素的内联样式。

let element = document.getElementById("myElement");
element.style.color = "red"; // 设置颜色为红色
element.style.fontSize = "20px"; // 设置字体大小

5. 创建和添加元素:

  • createElement(): 创建新的 HTML 元素。

let newParagraph = document.createElement("p");
  • appendChild(): 将新元素添加到父元素的子节点列表末尾。

let element = document.getElementById("myElement");
element.appendChild(newParagraph); // 将 newParagraph 添加到 myElement 的末尾
  • insertBefore(): 将新元素添加到父元素的指定子节点之前。

let existingElement = document.getElementById("existingElement");
element.insertBefore(newParagraph, existingElement); // 将 newParagraph 添加到 existingElement 之前

6. 删除元素:

  • removeChild(): 从父元素中删除指定的子元素。

let element = document.getElementById("myElement");
let childToRemove = document.getElementById("childToRemove");
element.removeChild(childToRemove); // 从 myElement 中删除 childToRemove

7. 事件处理:

let element = document.getElementById("myElement");
element.addEventListener('click', function() {alert("元素被点击了!");
});

四、一些重要的 DOM 属性和方法 (附带示例):

  • document.documentElement: 获取 <html> 元素。 console.log(document.documentElement);

  • document.body: 获取 <body> 元素。 console.log(document.body);

  • parentNode: 获取元素的父节点。 console.log(element.parentNode);

  • childNodes: 获取元素的所有子节点 (NodeList)。 console.log(element.childNodes);

  • firstChild: 获取元素的第一个子节点。 console.log(element.firstChild);

  • lastChild: 获取元素的最后一个子节点。 console.log(element.lastChild);

  • nextSibling: 获取元素的下一个兄弟节点。 console.log(element.nextSibling);

  • previousSibling: 获取元素的上一个兄弟节点。 console.log(element.previousSibling);

五、 避免常见错误:

  • 操作未加载的 DOM: 确保 DOM 完全加载后再执行 JavaScript 代码,可以使用 DOMContentLoaded 事件。

  • innerHTML 的安全风险: 使用 innerHTML 容易受到 XSS 攻击,需要谨慎使用,并进行必要的安全过滤。

  • 性能优化: 频繁操作 DOM 会影响性能,尽量减少不必要的 DOM 操作,可以使用文档片段 (DocumentFragment) 来批量更新 DOM。

六、DOM案例

HTML 页面:

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>DOM 操作示例</title>
</head>
<body><h1 id="header">欢迎来到 DOM 操作示例</h1>
<button onclick="changeText()">点击改变标题文字</button>
<div id="content"><p>这是一个段落。</p><ul><li>列表项 1</li><li>列表项 2</li><li>列表项 3</li></ul>
</div><script>
function changeText() {var header = document.getElementById("header");header.innerHTML = "DOM 文档对象模型示例";
}window.onload = function() {var listItems = document.querySelectorAll('#content ul li');for (var i = 0; i < listItems.length; i++) {(function(index) {listItems[index].onclick = function() {alert('点击了第 ' + (index + 1) + ' 个列表项');};})(i);}
};
</script></body>
</html>

解释:

  • HTML 部分:

    • <h1> 标签用于创建一个标题。
    • <button> 标签用于创建一个按钮,当用户点击该按钮时,将调用 changeText 函数。
    • <div> 包含了一个段落和一个无序列表。
  • JavaScript 部分:

    • changeText 函数通过获取具有 id="header" 的元素,并修改其 innerHTML 属性来改变标题的文本内容。
    • window.onload 事件处理器在页面加载完成后执行。它首先通过 querySelectorAll 获取所有的列表项,并为每个列表项添加点击事件处理程序。当列表项被点击时,会弹出一个警告框显示点击的是哪个列表项。

这个例子展示了如何使用 JavaScript 操作 HTML DOM(文档对象模型)中的元素,包括选择元素、修改元素内容以及响应用户的交互动作。

运行:

 

七、总结

DOM 是 JavaScript 操作网页的关键。 通过本文的介绍和示例,希望你对 JavaScript DOM 有了更深入的了解,并能够在实际开发中灵活运用。

相关文章:

【JavaScript】之文档对象模型(DOM)详解

JavaScript 的强大之处在于它能够与 HTML 和 CSS 交互&#xff0c;动态地修改网页内容和样式。而实现这一功能的核心就是 DOM&#xff08;文档对象模型&#xff09;。 一、什么是 DOM&#xff1f; DOM 是文档对象模型&#xff08;Document Object Model&#xff09;的缩写。它…...

速盾:cdn域名与ip区别

CDN&#xff08;内容分发网络&#xff09;是一种通过在全球多个服务器上缓存和分发静态资源的网络服务&#xff0c;可以提高网站的访问速度和性能。在使用CDN时&#xff0c;域名与IP地址是两个关键的概念。本文将介绍CDN域名与IP地址的区别和作用。 首先&#xff0c;CDN域名是…...

如何优雅的在页面上嵌入AI-Agent人工智能

前言 IDEA启动&#xff01;大模型的title想必不用我多说了&#xff0c;多少公司想要搭上时代前言技术的快车&#xff0c;感受科技的魅力。现在大模型作为降本增效的强大工具&#xff0c;基本上公司大多人都想要部署开发一把&#xff0c;更多的想要利用到这些模型放到生产中来提…...

如何对LabVIEW软件进行性能评估?

对LabVIEW软件进行性能评估&#xff0c;可以从以下几个方面着手&#xff0c;通过定量与定性分析&#xff0c;全面了解软件在实际应用中的表现。这些评估方法适用于确保LabVIEW程序的运行效率、稳定性和可维护性。 一、响应时间和执行效率 时间戳测量&#xff1a;使用LabVIEW的时…...

动态规划 —— dp问题-按摩师

1. 按摩师 题目链接&#xff1a; 面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/the-masseuse-lcci/description/ 2. 算法原理 状态表示&#xff1a;以某一个位置为结尾或者以某一个位置为起点 dp[i]表示&#xff1a;选择到i位置…...

SQL 语法学习

在当今数字化的时代&#xff0c;数据的管理和分析变得至关重要。而 SQL&#xff08;Structured Query Language&#xff09;&#xff0c;即结构化查询语言&#xff0c;作为一种用于管理关系型数据库的强大工具&#xff0c;掌握它对于从事数据相关工作的人来说是一项必备技能。在…...

MYSQL---TEST5(Trigger触发器Procedure存储过程综合练习)

触发器Trigger 数据库mydb16_trigger创建 表的创建 goods create table goods( gid char(8) primary key, #商品号 name varchar(10), #商品名 price decimal(8,2), #价格 num int&#xff1b;&#xff09; #数量orders create tabl…...

蓝桥杯 区间移位--二分、枚举

题目 代码 #include <stdio.h> #include <string.h> #include <vector> #include <algorithm> #include <iostream> using namespace std; struct node{ int a,b; }; vector<node> q; bool cmp(node x,node y){ return x.b <…...

Nginx 报错400 Request Header Or Cookie Too Large

错误的原因&#xff1a; 1、可能是你的网络DNS配置错误。 2、由request header过大所引起&#xff0c;request过大&#xff0c;通常是由于cookie中写入了较大的值所引起的。 3、访问太频繁&#xff0c;浏览器的缓存量太大&#xff0c;产生错误。 解决办法&#xff1a; 1、清…...

【Redis】一种常见的Redis分布式锁原理简述

本文主要简述一下基于set命令的Redis分布式锁的原理。 一&#xff0c;a线程持有的锁不要被b线程同时持有→setnx 抢锁的时候&#xff0c;最核心的就是&#xff0c;a线程持有的锁不要被b线程同时持有&#xff0c;放在基于set命令的redis分布式锁中来看&#xff0c;就是“如果锁…...

HOT100_最大子数组和

class Solution {public int maxSubArray(int[] nums) {int[] dp new int[nums.length];int res nums[0];dp[0] nums[0];for(int i 1; i< nums.length; i){dp[i] Math.max(nums[i] ,dp[i-1] nums[i]);res Math.max(res, dp[i]);}return res;} }...

DiskGenius工具扩容Mac OS X Apple APFS分区

DiskGenius是一款功能强大的磁盘分区工具&#xff0c;它支持Windows和Mac OS X系统&#xff0c;可以用于管理硬盘分区&#xff0c;包括扩容Mac OS X的Apple APFS分区。然而&#xff0c;直接使用DiskGenius来扩容Mac OS X的APFS分区可能存在一定的风险&#xff0c;因为不是专门为…...

从零开始的LeetCode刷题日记:70. 爬楼梯

一.相关链接 题目链接&#xff1a;70. 爬楼梯 二.心得体会 这道题还是动规五部曲。 1.首先是dp数组及其下标的含义&#xff0c;dp记录了每层楼梯对应的爬的方法&#xff0c;每个下标存储每个对应楼层。 2.然后是递归公式&#xff0c;其实每一层楼都是可以从下面一层和下面…...

Unity照片墙效果

Unity照片墙效果&#xff0c;如下效果展示 。 工程源码...

【自动化利器】12个评估大语言模型(LLM)质量的自动化框架

LLM评估是指在人工智能系统中评估和改进语言和语言模型的过程。在人工智能领域&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;及相关领域&#xff0c;LLM评估具有至高无上的地位。通过评估语言生成和理解模型&#xff0c;LLM评估有助于细化人工智能驱动的语言相…...

【1】基础概念

文章目录 一、特点二、基础语法注意三、官方编程指南四、go 语言标准库 API 一、特点 golang 一个 go 文件都要归属到一个包&#xff0c;需要进行申明。天然的并发&#xff1a;golang 从语言层面支持大并发。每个 go 文件都必须要归属到一个包中。执行 go 文件&#xff1a;go …...

HTML 文档规范与解析模式:DOCTYPE、<html> 标签以及结构化页面

文章目录 `<!DOCTYPE html>` 文档类型声明标准模式与怪异模式HTML5 的简化声明`<html>` 标签`<head>` 标签`<body>` 标签小结<!DOCTYPE html> 文档类型声明 在 HTML 文档中,<!DOCTYPE html> 是一个重要的文档类型声明,主要用于告知浏览…...

大模型微调技术 --> 脉络

Step1:脉络 微调技术从最早期的全模型微调演变成如今的各种参数高效微调(PEFT)方法&#xff0c;背后是为了应对大模型中的计算、存储和数据适应性的挑战 1.为什么有微调&#xff1f; 深度学习模型越来越大&#xff0c;尤其是 NLP 中的预训练语言模型(BERT, GPT)系列。如果从…...

不要只知道deepl翻译,这里有10个专业好用的翻译工具等着你。

deepl翻译的优点还是有很多的&#xff0c;比如翻译的准确性很高&#xff0c;支持翻译的语言有很多&#xff0c;并且支持翻译文件和文本。但是现在翻译工具那么多&#xff0c;大家需要翻译的场景也有很多&#xff0c;怎么能只拥有一个翻译工具呢。所以在这里我帮助大家寻找了一波…...

第二节 管道符、重定向与环境变量

1.重定向技术的 5 种模式 &#xff08;1&#xff09;标准覆盖输出重定向 &#xff08;2&#xff09;标准追加输出重定向 &#xff08;3&#xff09;错误覆盖输出重定向 &#xff08;4&#xff09;错误追加输出重定向 &#xff08;5&#xff09;输入重定向2.输入输出重定向 输入…...

从λκ观测量到喷注鉴别:探索夸克与胶子分类的最优尺度

1. 项目概述与核心问题在大型强子对撞机&#xff08;LHC&#xff09;上&#xff0c;我们每秒要处理数以亿计的质子-质子对撞事件。这些对撞产生的绝大多数产物&#xff0c;是量子色动力学&#xff08;QCD&#xff09;主导的强子化过程所形成的“喷注”——即高度准直的强子流。…...

反事实推理:用因果视角评估与缓解AI模型偏见

1. 项目概述&#xff1a;当模型决策需要“如果当初”在机器学习的世界里&#xff0c;我们常常面临一个困境&#xff1a;模型预测准确率很高&#xff0c;但我们却不知道它为什么做出这样的决策。更棘手的是&#xff0c;我们越来越频繁地发现&#xff0c;这些“黑箱”决策背后&am…...

AI Agent记忆系统工程:从短期记忆到长期知识的完整架构

为什么"记忆"是Agent工程化的核心难题 在2026年&#xff0c;构建一个能在单次对话中完成复杂任务的AI Agent已经相对成熟——LangGraph、AutoGen等框架提供了完善的工具链。但当我们试图构建一个能够跨会话学习、记住用户偏好、积累领域知识的AI应用时&#xff0c;挑…...

机器学习篇---图像分割

图像分割是计算机视觉的基础任务&#xff0c;简单说就是把图像划分成多个有意义的区域。经过多年发展&#xff0c;它已形成一套成熟的方法体系&#xff0c;大致可分为经典传统方法和现代深度学习方法两大流派。&#x1f4dc; 经典传统方法&#xff1a;基于数学与物理规则在深度…...

Kubernetes DaemonSet深度解析:管理集群守护进程的最佳实践

Kubernetes DaemonSet深度解析&#xff1a;管理集群守护进程的最佳实践 一、DaemonSet概述 DaemonSet 是Kubernetes中用于在集群的每个节点上运行一个Pod副本的控制器。它确保所有节点&#xff08;或满足特定条件的节点&#xff09;都运行该Pod的一个实例。 1.1 DaemonSet应…...

实际开发中 SQL 与产品的耦合与互动实践

引言 在产品开发初期,数据库 Schema(表结构)的设计是一个绕不开的核心问题。很多开发者,尤其是新手,常常会陷入一个两难境地:“Schema 需要一开始就完全确定好吗?如果后期要改动怎么办?到底要设计多少个表(Schema 数量)才算合适?” 这些问题背后,反映的是对软件工…...

FlashAttention的水印攻击:怎么知道你的模型被偷用或篡改了?

之前有个公司发现&#xff0c;他们的Llama-2-7B模型被人克隆了一份&#xff0c;部署在了另一个云服务上。巧的是&#xff0c;那个克隆模型的输出跟他们的一模一样——连生成风格都一样。 他们去查代码&#xff0c;发现对方的代码里也用了npu_flash_attention。他们想知道&…...

别再死记硬背真值表了!用Logsim动态仿真,直观理解RS和D触发器的工作原理

动态仿真教学&#xff1a;用Logsim破解RS与D触发器的核心原理 当你第一次翻开数字电路教材&#xff0c;看到那些密密麻麻的真值表和抽象的逻辑符号时&#xff0c;是否感到一阵眩晕&#xff1f;传统教学往往要求学生死记硬背各种触发器的状态转换规则&#xff0c;却很少解释这些…...

如何快速清理Windows右键菜单:终极管理工具完整指南

如何快速清理Windows右键菜单&#xff1a;终极管理工具完整指南 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是不是也遇到过这样的烦恼&#xff1f;安装的软…...

岩土工程渗流问题之有限单元法--坝基渗流、围堰、土石坝自由面、黏土垫层防渗、污染土固化后渗控

第一天 有限元编程基础知识1.有限单元法基础简介&#xff08;离散化、存储策略及方程解法、边界条件的处理&#xff09;2.编程语言Fortran及编译工具Intel Visual Fortran(IVF)简介3.Fortran/Matlab/Julia等开源代码及程序库&#xff08;geomlib/femlib&#xff09;简介4.水工…...