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
英文地址,請注明出處:http://en.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;依次層層向上搜索&…