很啰嗦,再次總結 DOM

DOM (文檔對象模型) 詳解

一、DOM 基礎概念

1. 定義與作用

DOM(Document Object Model)即文檔對象模型,是一種用于 HTML 和 XML 文檔的編程接口。它將文檔解析為一個由節點和對象組成的樹狀結構,允許程序和腳本動態訪問、修改文檔的內容、結構和樣式。

2. 核心特點
  • 樹形結構:DOM 將文檔表示為節點樹,每個節點可以有子節點。
  • 平臺和語言無關:DOM 可以被任何編程語言訪問,如 JavaScript、Python 等。
  • 動態交互:通過 DOM,程序可以實時改變文檔的內容和結構。
3. 節點類型

DOM 樹中的節點主要分為以下幾種類型:

  • 元素節點(Element Node):表示 HTML 元素,如 <div><p> 等。
  • 文本節點(Text Node):表示元素內的文本內容。
  • 屬性節點(Attribute Node):表示元素的屬性,如 idclass 等。
  • 文檔節點(Document Node):表示整個文檔,是 DOM 樹的根節點。
  • 注釋節點(Comment Node):表示 HTML 中的注釋。

二、DOM 樹結構

1. 節點關系
  • 父節點(Parent Node):每個節點(除根節點外)都有一個父節點。
  • 子節點(Child Node):一個節點可以有零個或多個子節點。
  • 兄弟節點(Sibling Node):共享同一個父節點的節點互為兄弟節點。
  • 祖先節點(Ancestor Node):父節點的父節點,依此類推。
  • 后代節點(Descendant Node):子節點的子節點,依此類推。
2. 示例 HTML 與 DOM 樹
<!DOCTYPE html>
<html>
<head><title>DOM 示例</title>
</head>
<body><div id="container"><h1>Hello, DOM!</h1><p class="content">這是一個 <a href="#">DOM 示例</a></p></div>
</body>
</html>

對應的簡化 DOM 樹結構:

Document
└── html (Element)├── head (Element)│   └── title (Element)│       └── "DOM 示例" (Text)└── body (Element)└── div (Element, id="container")├── h1 (Element)│   └── "Hello, DOM!" (Text)└── p (Element, class="content")├── "這是一個 " (Text)└── a (Element, href="#")└── "DOM 示例" (Text)└── "。" (Text)

三、JavaScript 中的 DOM 操作

1. 訪問 DOM 元素
通過 ID 訪問
const element = document.getElementById('container');
通過標簽名訪問
const paragraphs = document.getElementsByTagName('p');
// 返回 HTMLCollection 對象
通過類名訪問
const elements = document.getElementsByClassName('content');
// 返回 HTMLCollection 對象
通過選擇器訪問
const element = document.querySelector('#container p');
// 返回匹配的第一個元素const elements = document.querySelectorAll('p.content');
// 返回 NodeList 對象
2. 操作元素內容
修改文本內容
const heading = document.querySelector('h1');
heading.textContent = '新標題';
修改 HTML 內容
const container = document.getElementById('container');
container.innerHTML = '<p>新內容</p>';
3. 操作元素屬性
獲取屬性值
const link = document.querySelector('a');
const href = link.getAttribute('href');
設置屬性值
link.setAttribute('href', 'https://example.com');
link.setAttribute('target', '_blank');
直接訪問屬性
link.href = 'https://example.com';
link.target = '_blank';
4. 操作元素樣式
內聯樣式
const element = document.getElementById('container');
element.style.backgroundColor = 'lightblue';
element.style.width = '500px';
類操作
element.classList.add('active');
element.classList.remove('hidden');
element.classList.toggle('highlight');
5. 創建和修改元素
創建新元素
const newDiv = document.createElement('div');
newDiv.textContent = '新創建的元素';
添加子元素
const parent = document.getElementById('container');
parent.appendChild(newDiv);
插入元素
const referenceElement = document.querySelector('p');
parent.insertBefore(newDiv, referenceElement);
刪除元素
parent.removeChild(referenceElement);
替換元素
const newElement = document.createElement('span');
parent.replaceChild(newElement, referenceElement);
6. 事件處理
事件監聽
const button = document.getElementById('myButton');
button.addEventListener('click', function() {alert('按鈕被點擊了!');
});
事件對象
button.addEventListener('click', function(event) {console.log('事件類型:', event.type);console.log('觸發元素:', event.target);
});
事件冒泡與捕獲
  • 冒泡(Bubbling):事件從觸發元素向上傳播到父元素。
  • 捕獲(Capturing):事件從文檔根向下傳播到觸發元素。
// 使用捕獲階段
element.addEventListener('click', function() {// ...
}, true);
阻止事件傳播
event.stopPropagation();
阻止默認行為
event.preventDefault();

四、DOM 性能優化

1. 減少 DOM 操作
批量修改
// 低效
const list = document.getElementById('myList');
for (let i = 0; i < 1000; i++) {const item = document.createElement('li');item.textContent = `Item ${i}`;list.appendChild(item);
}// 高效
const fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {const item = document.createElement('li');item.textContent = `Item ${i}`;fragment.appendChild(item);
}
list.appendChild(fragment);
2. 使用事件委托
// 為大量按鈕添加事件
document.getElementById('buttonContainer').addEventListener('click', function(event) {if (event.target.tagName === 'BUTTON') {console.log('按鈕被點擊:', event.target.textContent);}
});
3. 緩存 DOM 引用
// 低效
for (let i = 0; i < 1000; i++) {document.getElementById('myElement').style.left = i + 'px';
}// 高效
const element = document.getElementById('myElement');
for (let i = 0; i < 1000; i++) {element.style.left = i + 'px';
}
4. 避免頻繁重排和重繪
重排(Reflow)

當 DOM 的變化影響了元素的布局信息時,瀏覽器需要重新計算元素的布局,將其安放在界面中的正確位置。

重繪(Repaint)

當一個元素的外觀發生改變,但沒有影響到布局信息時,瀏覽器會將新樣式應用到元素上。

優化建議
  • 批量修改樣式
  • 使用 documentFragment
  • 避免頻繁讀取布局信息
  • 使用 transform 和 opacity 進行動畫

五、DOM 與 XML

1. XML DOM

DOM 最初是為 XML 設計的,同樣適用于 HTML。XML DOM 提供了與 HTML DOM 類似的 API 來操作 XML 文檔。

2. XML 解析示例
const xmlText = '<book><title>JavaScript DOM</title><author>John Doe</author></book>';
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlText, 'text/xml');const title = xmlDoc.querySelector('title').textContent;
console.log('書名:', title);

六、DOM 標準

1. DOM 級別
  • DOM Level 1:1998 年發布,定義了基本的 DOM 結構和操作。
  • DOM Level 2:2000 年發布,增加了事件模型、樣式、遍歷和范圍等模塊。
  • DOM Level 3:2004 年發布,增加了文檔驗證、加載和保存等功能。
  • DOM Living Standard:W3C 持續更新的 DOM 標準。
2. DOM API 分類
  • 核心 DOM:通用的 DOM 操作接口。
  • HTML DOM:專門針對 HTML 的擴展。
  • SVG DOM:針對 SVG 圖形的擴展。
  • XML DOM:針對 XML 文檔的擴展。

七、高級 DOM 技術

1. 節點遍歷
const element = document.getElementById('container');
let node = element.firstChild;while (node) {console.log('節點類型:', node.nodeType);console.log('節點內容:', node.textContent);node = node.nextSibling;
}
2. 范圍(Range)
const range = document.createRange();
range.selectNode(document.getElementById('myElement'));// 復制范圍內容
const fragment = range.cloneContents();
document.body.appendChild(fragment);
3. Mutation Observer

監聽 DOM 變化的現代 API。

const observer = new MutationObserver((mutations) => {mutations.forEach((mutation) => {console.log('DOM 變化類型:', mutation.type);});
});const options = {childList: true,attributes: true,subtree: true
};observer.observe(document.body, options);

八、DOM 與性能監控

1. 使用 Performance API
// 測量 DOM 操作時間
console.time('dom操作');// DOM 操作
const element = document.createElement('div');
document.body.appendChild(element);console.timeEnd('dom操作');
2. Chrome DevTools 性能分析
  • 使用 Performance 面板記錄和分析頁面性能。
  • 關注 Layout(重排)和 Paint(重繪)事件。

九、DOM 安全問題

1. XSS 攻擊
  • 惡意代碼通過未過濾的用戶輸入注入到 DOM 中。
  • 防范措施:對用戶輸入進行過濾和轉義。
2. 安全編碼實踐
// 不安全
const userInput = '<script>alert("XSS");</script>';
document.getElementById('output').innerHTML = userInput;// 安全
const textNode = document.createTextNode(userInput);
document.getElementById('output').appendChild(textNode);

十、DOM 的未來發展

1. Web Components
  • 使用 Shadow DOM 創建封裝的組件。
  • 減少全局命名空間污染。
2. 虛擬 DOM
  • React、Vue 等框架使用虛擬 DOM 提高性能。
  • 減少直接操作真實 DOM 的頻率。

通過深入理解 DOM,開發者可以更高效地操作網頁內容,優化性能,并創建出交互性更強的 Web 應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905984.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905984.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905984.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ES6 (ECMAScript 2015) 詳解

文章目錄 一、ES6簡介1.1 什么是ES6&#xff1f;1.2 為什么要學習ES6&#xff1f;1.3 瀏覽器支持情況 二、let和const關鍵字2.1 let關鍵字2.2 const關鍵字2.3 var、let和const的選擇 三、箭頭函數3.1 基本語法3.2 箭頭函數的特點3.3 何時使用箭頭函數 四、模板字符串4.1 基本語…

LeetCode 746 使用最小花費爬樓梯

當然可以&#xff01;LeetCode 746 是一道經典的動態規劃入門題&#xff0c;我來用 C 為你詳細解釋。 題目描述 給定一個整數數組 cost&#xff0c;其中每個元素 cost[i] 表示從第 i 個臺階向上爬需要支付的費用。一旦支付費用&#xff0c;你可以選擇向上爬 1 步 或 2 步。 你…

6.1.1圖的基本概念

基本概念 圖&#xff1a; 頂點集邊集 頂點集&#xff1a;所有頂點的集合&#xff0c;不能為空&#xff08;因為圖是頂點集和邊集組成&#xff0c;其中一個頂點集不能為空&#xff0c;則圖肯定不為空&#xff09; 邊集&#xff1a;所有邊的集合&#xff0c;邊是由頂點集中的2…

WeakAuras Lua Script [TOC BOSS 5 - Anub‘arak ]

WeakAuras Lua Script [TOC BOSS 5 - Anubarak ] 阿努巴拉克 - 小強中蟲范圍 插件 !WA:2!DE1B0Xrvv8UmuRmIqZwiaXQmgKycwsYUPjPLZPTz3nBYULKnBNDtlYP6o)7T7mMzNz6BMnnBefBqGacIUOsXIkSIki)rCbLkIhLi6h8t3to6h9G2dXt4R9d(rR33mt2MyepQ75KSV3BUZ9FV7VF37g54rDvgU)yX7)GrRgvlQ2Y…

【C/C++】深度探索c++對象模型_筆記

1. 對象內存布局 (1) 普通類&#xff08;無虛函數&#xff09; 成員變量排列&#xff1a;按聲明順序存儲&#xff0c;但編譯器會根據內存對齊規則插入填充字節&#xff08;padding&#xff09;。class Simple {char a; // 1字節&#xff08;偏移0&#xff09;int b; …

湖北理元理律師事務所:債務優化中的雙維支持實踐解析

在債務壓力與生活質量失衡的社會議題下&#xff0c;法律服務機構的功能邊界正在從單一的法律咨詢向復合型支持延伸。湖北理元理律師事務所通過“法律心理”雙維服務模式&#xff0c;探索債務優化與生活保障的平衡路徑&#xff0c;其方法論或為行業提供實踐參考。 法律框架&…

Python uv包管理器使用指南:從入門到精通

Python uv包管理器使用指南&#xff1a;從入門到精通 作為一名Python開發者&#xff0c;你是否曾經為虛擬環境管理和依賴包安裝而頭疼&#xff1f;今天我要向大家介紹一個強大的工具——uv包管理器&#xff0c;它將徹底改變你的Python開發體驗。 什么是uv包管理器&#xff1f…

Windows系統安全加固

掌握的加固點&#xff1a; 用戶系統檢查 口令策略檢查 日志審計檢查 安全選項檢查 信息保護檢查 2.2.1 用戶系統檢查 #檢查系統版本內核 判斷依據&#xff1a;無 檢查方式&#xff1a;命令 msinfo32 dxdiag查看 #檢查Administrator賬號是否停用 判斷依據&#xff1a;禁…

小蝸牛撥號助手用戶使用手冊

一、軟件簡介 小蝸牛撥號助手是一款便捷實用的撥號輔助工具&#xff0c;能自動識別剪貼板中的電話號碼&#xff0c;支持快速撥號操作。最小化或關閉窗口后&#xff0c;程序將在系統后臺運行&#xff0c;還可設置開機自啟&#xff0c;方便隨時使用&#xff0c;提升撥號效率。 …

c/c++消息隊列庫RabbitMQ的使用

RabbitMQ C 消息隊列組件設計與實現文檔 1. 引言 1.1. RabbitMQ 簡介 RabbitMQ 是一個開源的消息代理軟件&#xff08;也稱為面向消息的中間件&#xff09;&#xff0c;它實現了高級消息隊列協議&#xff08;AMQP&#xff09;。RabbitMQ 服務器是用 Erlang 語言編寫的&#…

線程(二)OpenJDK 17 中線程啟動的完整流程用C++ 源碼詳解之主-子線程通信機制

深入解析OpenJDK 17中Java線程的創建與主-子線程通信機制 引言 在Java中&#xff0c;線程的創建與啟動通過Thread.start()實現&#xff0c;但底層是JVM與操作系統協作完成的復雜過程。本文基于OpenJDK 17的C源碼&#xff0c;揭秘Java線程創建時主線程與子線程的通信機制&…

多線程爬蟲語言選擇與實現

之前文中有人提到&#xff1a;想要一個簡單易用、能快速實現多線程爬蟲的方案&#xff0c;而且目標是小網站&#xff0c;基本可以確定對反爬蟲措施要求不高&#xff0c;這些就比較簡單了。 以往我肯定要考慮常見的編程語言中哪些適合爬蟲。Python、JavaScript&#xff08;Node…

AMD Vivado? 設計套件生成加密比特流和加密密鑰

概括 重要提示&#xff1a;有關使用AMD Vivado? Design Suite 2016.4 及更早版本進行 eFUSE 編程的重要更新&#xff0c;請參閱AMD設計咨詢 68832 。 本應用說明介紹了使用AMD Vivado? 設計套件生成加密比特流和加密密鑰&#xff08;高級加密標準伽羅瓦/計數器模式 (AES-GCM)…

Unity3D仿星露谷物語開發44之收集農作物

1、目標 在土地中挖掘后&#xff0c;灑下種子后逐漸成長&#xff0c;然后使用籃子收集成熟后的農作物&#xff0c;工具欄中也會相應地增加該農作物。 2、修改CropStandard的參數 Assets -> Prefabs -> Crop下的CropStandard&#xff0c;修改其Box Collider 2D的Size(Y…

list重點接口及模擬實現

list功能介紹 c中list是使用雙向鏈表實現的一個容器&#xff0c;這個容器可以實現。插入&#xff0c;刪除等的操作。與vector相比&#xff0c;vector適合尾插和尾刪&#xff08;vector的實現是使用了動態數組的方式。在進行頭刪和頭插的時候后面的數據會進行挪動&#xff0c;時…

CE17.【C++ Cont】練習題組17(堆專題)

目錄 1.P2085 最小函數值 題目 分析 方法1:暴力求解 方法2:二次函數的性質(推薦!) 代碼 提交結果 2.P1631 序列合并 分析 方法1:建兩個堆 第一版代碼 提交結果 第二版代碼 提交結果 第三版代碼 提交結果 方法2:只建一個堆 代碼 提交結果 1.P2085 最小函數值…

題單:表達式求值1

題目描述 給定一個只包含 “加法” 和 “乘法” 的算術表達式&#xff0c;請你編程計算表達式的值。 輸入格式 輸入僅有一行&#xff0c;為需要計算的表達式&#xff0c;表達式中只包含數字、加法運算符 和乘法運算符 *&#xff0c;且沒有括號。 所有參與運算的數字不超過…

DeepSeek超大模型的高效訓練策略

算力挑戰 訓練DeepSeek此類千億乃至萬億級別參數模型,對算力資源提出了極高要求。以DeepSeek-V3為例,其基礎模型參數量為67億,采用專家混合(MoE)架構后實際激活參數可達幾百億。如此規模的模型遠超單張GPU顯存容量極限,必須借助分布式并行才能加載和訓練。具體挑戰主要包…

MFC中DoDataExchange的簡明指南

基本概念 DoDataExchange 是 MFC 框架中實現數據自動同步的核心函數&#xff0c;主要用于對話框中控件與成員變量的雙向綁定。它能讓控件中的數據和成員變量自動保持一致&#xff0c;無需手動讀寫控件數據。 使用示例 1&#xff09;變量聲明 在對話框頭文件中聲明與控件對應…

FreeCAD源碼分析: Transaction實現原理

本文闡述FreeCAD中Transaction的實現原理。 注1&#xff1a;限于研究水平&#xff0c;分析難免不當&#xff0c;歡迎批評指正。 注2&#xff1a;文章內容會不定期更新。 一、概念 Ref. from What is a Transaction? A transaction is a group of operations that have the f…