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 树的层级关系

  • 父子关系 :元素可以包含子元素,例如:

    html 复制代码
    <div id="parent">
      <p>子元素</p> <!-- 子节点 -->
    </div>
  • 兄弟关系:同一父节点下的元素互为兄弟节点。

  • 祖先/后代关系:通过层级嵌套形成。

二、DOM 操作基础

2.1 选择元素

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

2.2 修改元素属性与样式

  • 修改属性

    javascript 复制代码
    elem.setAttribute('class', 'new-class'); // 设置属性
    elem.getAttribute('class'); // 获取属性值
    elem.removeAttribute('class'); // 移除属性
  • 修改样式

    javascript 复制代码
    elem.style.color = 'red'; // 直接修改内联样式
    elem.style.fontSize = '20px';

2.3 创建与删除节点

  • 创建元素

    javascript 复制代码
    const newDiv = document.createElement('div');
    newDiv.textContent = '动态创建的元素';
    document.body.appendChild(newDiv); // 添加到文档末尾
  • 插入元素到指定位置

    javascript 复制代码
    parent.insertBefore(newDiv, referenceElement); // 在参考节点前插入
  • 删除元素

    javascript 复制代码
    elem.remove(); // 直接删除元素

2.4 事件处理

  • 添加事件监听器

    javascript 复制代码
    document.getElementById('btn').addEventListener('click', () => {
      alert('按钮被点击!');
    });
  • 事件委托 (优化性能):

    javascript 复制代码
    document.getElementById('list').addEventListener('click', (e) => {
      if (e.target.tagName === 'LI') {
        alert('点击了:' + e.target.textContent);
      }
    });

三、DOM 性能优化

3.1 减少 DOM 操作次数

  • 使用文档片段(DocumentFragment)

    javascript 复制代码
    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 结合本地大模型实现自动化工作流。

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

需求

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

实现代码

html 复制代码
<!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 的高效操作方式。

相关推荐
望获linux21 小时前
【实时Linux实战系列】使用 u-trace 或 a-trace 进行用户态应用剖析
java·linux·前端·网络·数据库·elasticsearch·操作系统
zxg_神说要有光21 小时前
我好像找到了最适合我的生活状态
前端·javascript
飞哥数智坊21 小时前
今天,我的个人网站正式上线了!
前端
念念不忘 必有回响21 小时前
前端自动化部署全流程(Jenkins + Nginx)
前端·自动化·jenkins
爱上妖精的尾巴1 天前
5-22 WPS JS宏reduce数组的归并迭代应用(实例:提取最大最小值的记录)
服务器·前端·javascript·笔记·wps·js宏
IT_陈寒1 天前
Java性能调优:这5个被你忽略的JVM参数让你的应用吞吐量提升50%!
前端·人工智能·后端
孤客网络科技工作室1 天前
Python - 100天从新手到大师:第五十七天获取网络资源及解析HTML页面
开发语言·python·html
叶梅树1 天前
从零构建量化学习工具:动量策略(Momentum Strategy)
前端·后端·机器学习
MyFreeIT1 天前
Page光标focus在某个控件
前端·javascript·vue.js
通往曙光的路上1 天前
day8_elementPlus
前端·javascript·vue.js