JavaScript中DOM核心操作的實戰(zhàn)指南
JavaScript DOM 核心操作:從內(nèi)容到節(jié)點的實戰(zhàn)指南
(2025–2026 年仍然最常用的原生 DOM API 寫法與現(xiàn)代最佳實踐)
以下內(nèi)容按實際開發(fā)中最常用的操作順序組織,從查找 → 創(chuàng)建 → 修改 → 插入 → 刪除 → 屬性/樣式 → 事件 → 遍歷,并標(biāo)注常見陷阱與現(xiàn)代替代方案。
1. 查找節(jié)點(最常用 Top 10 方法)
| 優(yōu)先級 | 方法 | 說明 | 返回值 | 現(xiàn)代推薦場景 | 性能備注 |
|---|---|---|---|---|---|
| 1 | document.querySelector(selector) | CSS 選擇器,第一個匹配 | Element 或 null | 幾乎所有場景首選 | 較慢但最靈活 |
| 2 | document.querySelectorAll(selector) | 所有匹配 | NodeList(靜態(tài)) | 需要多個元素時首選 | 靜態(tài)快照,不隨 DOM 變化 |
| 3 | element.querySelector(…) | 從某個元素開始查找 | Element 或 null | 局部查找,性能更好 | — |
| 4 | getElementById(id) | 通過 id,最快 | Element 或 null | 有明確 id 時首選 | 最快 |
| 5 | getElementsByClassName(class) | 通過類名 | HTMLCollection(動態(tài)) | 舊代碼常見,新代碼少用 | 動態(tài)集合,慎用 |
| 6 | getElementsByTagName(tag) | 通過標(biāo)簽名 | HTMLCollection(動態(tài)) | 少用 | 動態(tài)集合 |
| 7 | element.closest(selector) | 向上查找最近的匹配祖先 | Element 或 null | 事件委托中非常常用 | 非常實用 |
| 8 | element.matches(selector) | 判斷當(dāng)前元素是否匹配選擇器 | boolean | 事件委托判斷類型時用 | — |
| 9 | document.getElementsByName(name) | 通過 name 屬性(表單元素常見) | NodeList | 極少用 | — |
| 10 | element.children | 只獲取直接子元素(不含文本節(jié)點) | HTMLCollection | 常用于只關(guān)心元素子節(jié)點 | 動態(tài) |
2025–2026 推薦優(yōu)先級口訣:id → querySelector → querySelectorAll → closest → children
2. 創(chuàng)建與克隆節(jié)點
// 創(chuàng)建元素
const div = document.createElement('div');
div.textContent = 'Hello';
div.className = 'box active';
div.dataset.id = '123';
// 創(chuàng)建文本節(jié)點(最常用)
const text = document.createTextNode('純文本內(nèi)容');
// 克隆節(jié)點(深度克隆最常用)
const clone = original.cloneNode(true); // true = 深克?。ò庸?jié)點)
const shallow = original.cloneNode(false); // 只克隆自身
3. 修改內(nèi)容(四種主流方式對比)
| 方法 | 修改方式 | 是否解析 HTML | 會清除原有事件監(jiān)聽? | 推薦場景 | 陷阱 |
|---|---|---|---|---|---|
element.innerHTML | 替換全部內(nèi)容 | 是 | 是 | 需要插入 HTML 結(jié)構(gòu)時 | XSS 風(fēng)險、性能差、丟失事件 |
element.textContent | 純文本 | 否 | 否 | 最推薦(安全、高性能) | 不會解析標(biāo)簽 |
element.innerText | 考慮 CSS 顯示的文本 | 否 | 否 | 需要考慮樣式隱藏的內(nèi)容 | 性能最差(會重排) |
element.insertAdjacentHTML(position, html) | 在指定位置插入 HTML | 是 | 否(只影響新內(nèi)容) | 局部插入 HTML 時最佳 | 仍需防范 XSS |
位置參數(shù)(insertAdjacent* 方法通用):
'beforebegin'→ 元素前面'afterbegin'→ 元素內(nèi)部最前面'beforeend'→ 元素內(nèi)部最后面(最常用)'afterend'→ 元素后面
4. 插入節(jié)點(現(xiàn)代最推薦的 5 種方式)
// 方式1:最常用、最直觀(2020年后主流) parent.append(child); // 末尾添加(可多個) parent.prepend(child); // 開頭添加 parent.before(child); // 兄弟前插入 parent.after(child); // 兄弟后插入 // 方式2:經(jīng)典但已被取代 parent.appendChild(child); // 只支持一個節(jié)點 parent.insertBefore(newNode, referenceNode); // 方式3:批量插入(性能最好) const fragment = document.createDocumentFragment(); fragment.append(div1, div2, div3); // 不會引起多次重排 parent.appendChild(fragment); // 一次性插入
5. 刪除 & 清空節(jié)點
// 刪除自身(最常用)
element.remove(); // 現(xiàn)代首選
// 舊方式(仍兼容)
parent.removeChild(element);
// 清空所有子節(jié)點(三種方式對比)
element.innerHTML = ''; // 最快,但有 XSS 風(fēng)險
while (element.firstChild) {
element.removeChild(element.firstChild);
}
element.replaceChildren(); // 現(xiàn)代最推薦(2020+),干凈、高效
6. 屬性操作(attr vs property)
| 操作類型 | 方法/屬性 | 適用場景 | 注意事項 |
|---|---|---|---|
| 自定義屬性 | element.dataset.xxx | data-* 屬性 | 自動駝峰轉(zhuǎn)換 |
| class | classList.add/remove/toggle/contains/replace | class 操作首選 | 比 className 好用 100 倍 |
| style | element.style.color = 'red' | 行內(nèi)樣式 | 優(yōu)先用 class 代替 |
| 通用屬性 | setAttribute / getAttribute / hasAttribute / removeAttribute | HTML 屬性 | value、checked、disabled 等特殊 |
| DOM 屬性 | element.value / checked / disabled | 表單元素的“當(dāng)前狀態(tài)” | 優(yōu)先使用 DOM 屬性而非 getAttribute |
7. 事件綁定(現(xiàn)代寫法)
// 推薦寫法(2020+)
button.addEventListener('click', (e) => {
// e.currentTarget vs e.target
// e.preventDefault()
// e.stopPropagation()
}, { once: true, passive: true }); // 優(yōu)化選項
// 事件委托(性能最佳)
document.addEventListener('click', (e) => {
if (e.target.matches('.delete-btn')) {
// 處理刪除
}
});
// 移除事件(必須是同一個函數(shù)引用)
const handler = () => console.log('clicked');
btn.addEventListener('click', handler);
btn.removeEventListener('click', handler);
8. 遍歷節(jié)點(常用集合對比)
| 集合類型 | 是否動態(tài) | 包含什么 | 推薦遍歷方式 |
|---|---|---|---|
| childNodes | 動態(tài) | 元素 + 文本 + 注釋 | for…of 或 for 循環(huán) |
| children | 動態(tài) | 只元素 | for…of 或 for 循環(huán) |
| querySelectorAll | 靜態(tài) | 只元素 | forEach / for…of |
| NodeList(部分) | 部分動態(tài) | — | — |
9.2025–2026 高頻面試 + 真實項目避坑點
innerHTMLvstextContentvsinsertAdjacentHTML的 XSS 風(fēng)險對比appendChildvsappend的參數(shù)差異(append 支持多個 + 字符串)- 事件委托中
e.targetvse.currentTargetvsthis的區(qū)別 className = ' '會清空所有 class,推薦用classListdataset屬性自動駝峰:data-user-id → element.dataset.userId- Fragment 批量插入 vs 多次 appendChild 的性能差距(可達(dá) 10–100 倍)
remove()方法 IE 不支持(需 polyfill 或用 parent.removeChild)closest()從自身開始找(包含自己)
需要哪一部分更詳細(xì)的完整示例代碼(如:動態(tài)表格增刪改查、拖拽排序、事件委托實現(xiàn) tab 切換、虛擬列表簡化版等),或者想看某個具體場景的對比寫法?可以告訴我,我再展開。
以上就是JavaScript中DOM核心操作的實戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于JavaScript DOM操作的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Electron中實現(xiàn)大文件上傳和斷點續(xù)傳功能
Electron是開源的框架,可以使用h5來開發(fā)跨平臺pc桌面應(yīng)用,這樣前端開發(fā)這可以開發(fā)桌面應(yīng)用了。這篇文章主要介紹了Electron中實現(xiàn)大文件上傳和斷點續(xù)傳功能,需要的朋友可以參考下2018-10-10
JavaScript實現(xiàn)淘寶京東6位數(shù)字支付密碼效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實現(xiàn)淘寶京東6位數(shù)字支付密碼效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08
javascript去除字符串中所有標(biāo)點符號和提取純文本的正則
這篇文章主要介紹了javascript去除字符串中所有標(biāo)點符號和提取純文本的正則,需要的朋友可以參考下2014-06-06
JavaScript數(shù)據(jù)結(jié)構(gòu)之棧實例用法
在本篇文章里小編給大家分享了關(guān)于JavaScript數(shù)據(jù)結(jié)構(gòu)之棧實例用法內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2019-01-01
div+css+js模擬tab切換效果 事件綁定 IE,firefox兼容
div+css+js模擬tab,這個版本,理論上可以添加無限個tab,而且,你只要管內(nèi)容的添加行了,不需要改JS2009-12-12

