简介:本文全面解析DOM模型的核心概念、操作方法及实际应用场景,通过代码示例与理论结合,帮助开发者快速掌握DOM操作技巧,提升前端开发效率。
DOM(Document Object Model,文档对象模型)是W3C制定的标准接口,用于将HTML/XML文档结构化为一棵由节点组成的树形模型。每个节点(如元素、属性、文本)都是对象,开发者可通过JavaScript动态访问和修改这些对象,实现页面内容的实时更新。
以<div id="container"><p>Hello</p></div>为例,其DOM树结构如下:
Document└── html└── body└── #container (div)└── "Hello" (text node inside p)
关键节点类型:
<div>)。id="container")。| 方法 | 示例 | 返回值 |
|---|---|---|
getElementById |
document.getElementById("x") |
单个元素(或null) |
getElementsByClassName |
document.getElementsByClassName("y") |
动态HTMLCollection |
querySelector |
document.querySelector(".z") |
首个匹配元素 |
querySelectorAll |
document.querySelectorAll("p") |
静态NodeList |
实践建议:
querySelector/querySelectorAll,支持CSS选择器语法。
// 修改文本内容const para = document.querySelector("p");para.textContent = "New text"; // 替换全部文本para.innerHTML = "<strong>Bold</strong> text"; // 解析HTML标签// 修改属性const img = document.querySelector("img");img.src = "new.jpg"; // 修改src属性img.setAttribute("alt", "Description"); // 使用setAttribute方法
注意事项:
textContent vs innerHTML:前者安全(防XSS攻击),后者灵活(支持HTML)。dataset管理自定义数据属性。
// 创建新元素const newDiv = document.createElement("div");newDiv.className = "box";newDiv.textContent = "Dynamic content";// 插入到DOM中document.body.appendChild(newDiv); // 添加到末尾document.querySelector("#container").prepend(newDiv); // 添加到开头// 插入相邻节点const referenceNode = document.querySelector("p");referenceNode.after(newDiv); // 在p后插入
性能优化:
DocumentFragment批量插入节点,减少重绘。
const fragment = document.createDocumentFragment();for (let i = 0; i < 100; i++) {const li = document.createElement("li");li.textContent = `Item ${i}`;fragment.appendChild(li);}document.querySelector("ul").appendChild(fragment);
// 方式1:HTML属性(不推荐,混合结构与行为)<button onclick="alert('Clicked')">Click</button>// 方式2:DOM属性绑定const btn = document.querySelector("button");btn.onclick = function() { alert("Clicked"); };// 方式3:addEventListener(推荐)btn.addEventListener("click", function(e) {console.log("Event target:", e.target);});// 解绑事件function handleClick() { /* ... */ }btn.addEventListener("click", handleClick);btn.removeEventListener("click", handleClick); // 必须传入相同函数引用
事件流机制:
window向下传播到目标元素。window。实践技巧:
event.stopPropagation()阻止事件冒泡。
document.querySelector("ul").addEventListener("click", function(e) {if (e.target.tagName === "LI") {console.log("Clicked list item:", e.target.textContent);}});
优化策略:
offsetWidth等会触发回流的属性。transform和opacity实现动画(触发GPU加速)。display: none),修改后再显示。React/Vue等框架通过虚拟DOM(Virtual DOM)优化性能:
示例对比:
// 原生DOM操作(多次回流)for (let i = 0; i < 1000; i++) {const div = document.createElement("div");div.textContent = i;document.body.appendChild(div);}// 虚拟DOM思路(单次回流)const fragment = document.createDocumentFragment();for (let i = 0; i < 1000; i++) {const div = document.createElement("div");div.textContent = i;fragment.appendChild(div);}document.body.appendChild(fragment);
<input type="text" id="filter" placeholder="Search..."><ul id="list"><li>Apple</li><li>Banana</li><li>Orange</li></ul><script>document.getElementById("filter").addEventListener("input", function(e) {const searchTerm = e.target.value.toLowerCase();const items = document.querySelectorAll("#list li");items.forEach(item => {const text = item.textContent.toLowerCase();if (text.includes(searchTerm)) {item.style.display = "";} else {item.style.display = "none";}});});</script>
扩展优化:
classList.add/remove替代style.display。推荐学习路径:
通过系统学习与实践,开发者可高效利用DOM模型构建动态、交互性强的Web应用。