HTML 树结构(DOM)深入讲解教程

一、HTML 树结构的核心概念

1.1 DOM(文档对象模型)的定义

DOM(Document Object Model)是 W3C 制定的标准接口,允许程序或脚本(如 JavaScript)动态访问和更新 HTML/XML 文档的内容、结构和样式。它将文档表示为一棵树状结构,每个 HTML 元素、属性或文本内容都对应树中的一个节点。

1.2 DOM 树的节点类型

DOM 树由多种节点构成,常见类型包括:

  • 元素节点(Element Node):如 <div><p> 等 HTML 标签。
  • 文本节点(Text Node):元素内的文本内容,如 <p>Hello</p> 中的 “Hello”。
  • 属性节点(Attribute Node):元素的属性,如 <img src="image.jpg"> 中的 src
  • 文档节点(Document Node):整个文档的根节点,通过 document 对象访问。
  • 注释节点(Comment Node):如 <!-- 这是一个注释 -->

1.3 DOM 树的层级关系

  • 父子关系:元素可以包含子元素,例如:
    <div id="parent"><p>子元素</p> <!-- 子节点 -->
    </div>
    
  • 兄弟关系:同一父节点下的元素互为兄弟节点。
  • 祖先/后代关系:通过层级嵌套形成。

二、DOM 操作基础

2.1 选择元素

方法示例适用场景
getElementByIddocument.getElementById('id')通过唯一 ID 获取元素
getElementsByTagNamedocument.getElementsByTagName('p')通过标签名批量获取元素
getElementsByClassNamedocument.getElementsByClassName('class')通过类名批量获取元素
querySelectordocument.querySelector('div.class')通过 CSS 选择器获取第一个匹配元素
querySelectorAlldocument.querySelectorAll('ul > li')通过 CSS 选择器获取所有匹配元素

2.2 修改元素属性与样式

  • 修改属性
    elem.setAttribute('class', 'new-class'); // 设置属性
    elem.getAttribute('class'); // 获取属性值
    elem.removeAttribute('class'); // 移除属性
    
  • 修改样式
    elem.style.color = 'red'; // 直接修改内联样式
    elem.style.fontSize = '20px';
    

2.3 创建与删除节点

  • 创建元素
    const newDiv = document.createElement('div');
    newDiv.textContent = '动态创建的元素';
    document.body.appendChild(newDiv); // 添加到文档末尾
    
  • 插入元素到指定位置
    parent.insertBefore(newDiv, referenceElement); // 在参考节点前插入
    
  • 删除元素
    elem.remove(); // 直接删除元素
    

2.4 事件处理

  • 添加事件监听器
    document.getElementById('btn').addEventListener('click', () => {alert('按钮被点击!');
    });
    
  • 事件委托(优化性能):
    document.getElementById('list').addEventListener('click', (e) => {if (e.target.tagName === 'LI') {alert('点击了:' + e.target.textContent);}
    });
    

三、DOM 性能优化

3.1 减少 DOM 操作次数

  • 使用文档片段(DocumentFragment)
    const fragment = document.createDocumentFragment();
    for (let i = 0; i < 10; i++) {const li = document.createElement('li');li.textContent = `Item ${i + 1}`;fragment.appendChild(li);
    }
    document.getElementById('list').appendChild(fragment); // 一次性插入
    

3.2 虚拟 DOM(Virtual DOM)

现代框架(如 React、Vue)通过虚拟 DOM 优化更新:

  • React:采用自顶向下的全量 diff 算法,通过 shouldComponentUpdate 避免不必要的渲染。
  • Vue:通过依赖追踪实现精准更新,减少 diff 范围。

四、2025 年 DOM 技术趋势

4.1 前端框架演进

  • React:React 19 引入 React Server Components (RSC),提升 SSR/SSG 性能。
  • Vue:Vue 3 的 Composition API 和 Teleport 组件提高开发效率。
  • 新兴框架:Svelte(无虚拟 DOM)、Qwik(极速加载)适合性能敏感场景。

4.2 工具链升级

  • 构建工具:Vite(基于 esbuild)取代 Webpack,Rolldown 逐步替换 Rollup。
  • 状态管理:Zustand(React)和 Pinia(Vue)成为主流。

4.3 AI 驱动开发

  • AI 工具:Cursor、bolt.new 通过自然语言生成代码,简化开发流程。
  • 低代码平台:n8n 结合本地大模型实现自动化工作流。

五、实战案例:动态表格操作

需求

  • 创建一个表格,支持动态添加/删除行。
  • 点击行高亮显示。

实现代码

<!DOCTYPE html>
<html>
<body><button onclick="addRow()">添加行</button><table id="myTable"><tr><th>姓名</th><th>年龄</th></tr></table><script>function addRow() {const table = document.getElementById('myTable');const newRow = table.insertRow();newRow.insertCell().textContent = `用户${table.rows.length - 1}`;newRow.insertCell().textContent = Math.floor(Math.random() * 100);newRow.addEventListener('click', () => {// 移除所有行的高亮Array.from(table.rows).forEach(row => row.classList.remove('highlight'));newRow.classList.add('highlight');});}</script><style>.highlight { background-color: yellow; }</style>
</body>
</html>

六、总结

  • DOM 是前端开发的核心:通过操作 DOM 实现动态交互,是网页功能实现的基础。
  • 性能优化至关重要:减少直接 DOM 操作,善用虚拟 DOM 和现代框架。
  • 紧跟技术趋势:2025 年前端开发向 AI 驱动、跨平台、微前端方向发展,掌握 TypeScript、SSR/SSG 等技术是关键。

通过本文,您已掌握 HTML 树结构的深层原理与实战技巧,建议结合现代框架(如 React/Vue)进一步探索 DOM 的高效操作方式。

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

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

相关文章

用鼠标点击终端窗口的时候出现:0;61;50M0;61;50M0;62;50M0

在做aws webrtc viewer拉流压测的过程中&#xff0c;我本地打开了多个终端&#xff0c;用于连接EC2实例&#xff1a; 一个终端用于启动 ‘并发master脚本’、监控master端的cpu、mem&#xff1b;一个终端用于监控master端的带宽情况&#xff1b;一个终端用于监控viewer端的cpu、…

C++-linux 5.gdb调试工具

GDB调试工具 在C/C开发中&#xff0c;程序运行时的错误往往比编译错误更难定位。GDB&#xff08;GNU Debugger&#xff09;是Linux环境下最强大的程序调试工具&#xff0c;能够帮助开发者追踪程序执行流程、查看变量状态、定位内存错误等。本章将从基础到进阶&#xff0c;全面讲…

Update~Read PLC for Chart ~ Log By Shift To be... Alarm AI Machine Learning

上图~ 持续迭代 1、增加报警弹窗,具体到哪个值,双边规格具体是多少 2、实时显示当前值的统计特征,Max Min AVG ... import tkinter as tk from tkinter import simpledialog import time import threading import queue import logging from datetime import datet…

es的自定义词典和停用词

在 Elasticsearch 中&#xff0c;自定义词典是优化分词效果的核心手段&#xff0c;尤其适用于中文或专业领域的文本处理。以下是关于 ES 自定义词典的完整指南&#xff1a; 为什么需要自定义词典&#xff1f; 默认分词不足&#xff1a; ES 自带的分词器&#xff08;如 Standard…

微算法科技技术突破:用于前馈神经网络的量子算法技术助力神经网络变革

随着量子计算和机器学习的迅猛发展&#xff0c;企业界正逐步迈向融合这两大领域的新时代。在这一背景下&#xff0c;微算法科技&#xff08;NASDAQ:MLGO&#xff09;成功研发出一套用于前馈神经网络的量子算法&#xff0c;突破了传统神经网络在训练和评估中的性能瓶颈。这一创新…

一文读懂循环神经网络(RNN)—语言模型+读取长序列数据(2)

目录 读取长序列数据 为什么需要 “读取长序列数据”&#xff1f; 读取长序列数据的核心方法 1. 滑动窗口&#xff08;Sliding Window&#xff09; 2. 分段截取&#xff08;Segmentation&#xff09; 3. 滚动生成&#xff08;Rolling Generation&#xff09; 4. 关键信息…

Oracle Virtualbox 虚拟机配置静态IP

Oracle Virtualbox 虚拟机配置静态IP VirtualBox的网卡&#xff0c;默认都是第一个不能自定义&#xff0c;后续新建的可以自定义。 新建NAT网卡、host主机模式网卡 依次点击&#xff1a;管理->工具->网络管理器新建host主机模式网卡 这个网卡的网段自定义&#xff0c;创建…

Linux RAID1 创建与配置实战指南(mdadm)

Linux RAID1 创建与配置实战指南&#xff08;mdadm&#xff09;一、RAID1 核心价值与实战目标RAID1&#xff08;磁盘镜像&#xff09; 通过数据冗余提供高可靠性&#xff1a;当单块硬盘损坏时&#xff0c;数据不丢失支持快速阵列重建读写性能略低于单盘&#xff08;镜像写入开销…

MySQL数据库----函数

目录函数1&#xff0c;字符串函数2&#xff0c;数值函数3&#xff0c;日期函数4&#xff0c;流程函数函数 1&#xff0c;字符串函数 MySQL中内置了很多字符串函数 2&#xff0c;数值函数 3&#xff0c;日期函数 4&#xff0c;流程函数

1.2 vue2(组合式API)的语法结构以及外部暴露

vue2 vue3中可以写vue2的语法&#xff0c;vue2的结构像一个花盆里的根&#xff08;根组件App.vue&#xff09;&#xff0c;根上可以插上不同的枝杈和花朵&#xff08;组件&#xff09;。 组件的结构&#xff1a; // 这里写逻辑行为 <script lang"ts"> export d…

Swift 解 LeetCode 324:一步步实现摆动排序 II,掌握数组重排的节奏感

文章目录摘要描述题解答案题解代码&#xff08;Swift&#xff09;题解代码分析步骤一&#xff1a;排序数组步骤二&#xff1a;左右指针分段步骤三&#xff1a;按位置交错插入示例测试及结果示例 1示例 2示例 3&#xff08;边界情况&#xff09;时间复杂度分析空间复杂度分析总结…

使用SQLMAP的文章管理系统CMS的sql注入渗透测试

SQLMAP注入演示&#xff1a;抓包拿到Cookie:召唤sqlmap&#xff1a;sqlmap -u "http://192.168.1.99:8085/show.php?id34" --cookie "pma_langzh_CN; kbqug_admin_username2621-PL_LxhFjyVe43ZuQvht6MI5q0ZcpRVV5FI0pzQ6XR8; kbqug_siteid2621-PL_LxhFjyVe4yA5…

I3C通信协议核心详解

一、物理层与电气特性双线结构 SCL&#xff08;串行时钟线&#xff09;&#xff1a;主设备控制&#xff0c;支持 推挽&#xff08;Push-Pull&#xff09;输出&#xff08;高速模式&#xff09;和 开漏&#xff08;Open-Drain&#xff09;&#xff08;兼容I2C模式&#xff09;。…

Docker搭建Redis哨兵集群

Redis提供了哨兵机制实现主从集群下的故障转移&#xff0c;其中包含了对主从服务的检测、自动故障恢复和通知。 1.环境 centos7、redis6.2.4、MobaXterm 目的&#xff1a; 搭建redis的主从同步哨兵集群&#xff08;一主一从三哨兵&#xff09; 2.步骤 1.主从集群的搭建 主从…

暑假Python基础整理 --异常处理及程序调试

异常概念 在程序运行过程中&#xff0c;经常会遇到各种各样的错误&#xff0c;这些错误统称为“异常”。如下表是Python常见的异常与描述&#xff1a; 异常描述NameError尝试访问一个未声明的变量引发错误IndexError索引超出序列范围引发错误IndentationError缩进错误ValueErr…

k8s-高级调度(二)

目录 Taint(污点)与Toleration(容忍) Taint&#xff08;污点&#xff09;&#xff1a;节点的排斥标记 Toleration&#xff08;容忍&#xff09;&#xff1a;Pod的适配声明 与节点亲和性的对比 警戒(cordon)和转移(drain) Cordon&#xff1a;节点隔离&#xff08;阻止新 Po…

基于OpenCV的深度学习人脸识别系统开发全攻略(DNN+FaceNet核心技术选型)

核心技术选型表 技术组件版本/型号用途OpenCV DNN4.5.5人脸检测FaceNet (facenet-pytorch)0.5.0人脸特征提取MiniConda最新版Python环境管理PyTorch1.8.0FaceNet运行基础OpenVINO2021.4模型加速(可选)SSD Caffe模型res10_300x300高精度人脸检测 一、环境准备与项目搭建 1.1 M…

【AI News | 20250714】每日AI进展

AI Repos 1、All-Model-Chat All Model Chat 是一款为Google Gemini API家族设计的网页聊天应用&#xff0c;支持多模态输入&#xff08;图片、音频、PDF等&#xff09;和多种模型&#xff08;如Gemini Flash、Imagen&#xff09;。它提供了丰富的自定义功能&#xff0c;包括高…

C 语言(二)

主要包括变量与常量、数据类型、存储方式、数制转换以及字符处理等内容一、变量与常量在 C 语言中&#xff0c;变量是用来存储数据的命名空间&#xff0c;它会在内存中分配地址。例如&#xff1a;int i; i 12345; 其中 i 是变量&#xff0c;12345 是常量。常量表示在程序运行过…

原型继承(prototypal inheritance)的工作原理

这是一个非常常见的 JavaScript 问题。所有 JS 对象都有一个__proto__属性&#xff0c;指向它的原型对象。当试图访问一个对象的属性时&#xff0c;如果没有在该对象上找到&#xff0c;它还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&…