Skip to content

JavaScript DOM 操作指南

一、DOM 核心操作分类

🔍 元素查找操作

操作类型核心 API说明示例
ID 查找document.getElementById(id)通过 ID 查找元素,返回单个元素(不存在则 null);ID 唯一,性能最优const box = document.getElementById('box');
类名查找document.getElementsByClassName(className)通过类名查找,返回 HTMLCollection(动态集合)const items = document.getElementsByClassName('item');
标签查找document.getElementsByTagName(tagName)通过标签名查找,返回 HTMLCollectionconst divs = document.getElementsByTagName('div');
选择器查找document.querySelector(selector)通过 CSS 选择器查找,返回第一个匹配元素const firstItem = document.querySelector('.item');
选择器全查找document.querySelectorAll(selector)通过 CSS 选择器查找,返回 NodeList(静态集合)const allItems = document.querySelectorAll('.item');
子元素查找element.querySelector/querySelectorAll基于父元素查找子元素,范围更精准const child = box.querySelector('.child');

➕ 元素创建与插入

操作类型核心 API说明示例
创建元素document.createElement(tagName)创建新元素节点const newDiv = document.createElement('div');
末尾插入parent.appendChild(child)将子元素插入父元素末尾box.appendChild(newDiv);
指定位置插入parent.insertBefore(newNode, referenceNode)将新元素插入参考元素之前box.insertBefore(newDiv, box.firstChild);
创建文本节点document.createTextNode(text)创建文本节点const textNode = document.createTextNode('Hello');
HTML 内容设置element.innerHTML解析 HTML 字符串并替换元素内容(有 XSS 风险)box.innerHTML = '<p>内容</p>';
文本内容设置element.textContent设置/获取元素文本内容(纯文本,无 XSS 风险)box.textContent = 'Hello World';

❌ 元素删除与替换

操作类型核心 API说明示例
删除子元素parent.removeChild(child)删除子元素(需先获取父元素)box.removeChild(newDiv);
直接删除element.remove()直接删除元素(无需父元素,更简洁)newDiv.remove();
替换元素parent.replaceChild(newNode, oldNode)替换子元素box.replaceChild(newDiv, box.firstChild);

🔧 属性操作

操作类型核心 API说明示例
获取属性element.getAttribute(attr)获取元素属性值(包括自定义属性)const src = img.getAttribute('src');
设置属性element.setAttribute(attr, value)设置元素属性值img.setAttribute('alt', '示例图片');
删除属性element.removeAttribute(attr)删除元素属性img.removeAttribute('title');
自定义属性element.dataset[key]操作 data-* 自定义属性(更规范)box.dataset.id = '123'; // 对应 data-id="123"
原生属性element.attr(原生属性)直接操作内置属性(如 id、src、href)box.id = 'new-box';

🎨 样式操作

操作类型核心 API说明示例
行内样式element.style.cssProperty设置行内样式(驼峰命名,如 backgroundColor)box.style.backgroundColor = 'red';
添加类名element.classList.add(className)添加类名box.classList.add('active');
移除类名element.classList.remove(className)移除类名box.classList.remove('active');
切换类名element.classList.toggle(className)切换类名(存在则删,不存在则加)box.classList.toggle('active');
判断类名element.classList.contains(className)判断是否包含类名const isActive = box.classList.contains('active');

🔄 节点遍历

操作类型核心 API说明示例
父节点element.parentNode获取父节点const parent = newDiv.parentNode;
所有子节点element.childNodes获取所有子节点(包括文本/注释节点),返回 NodeListconst allNodes = box.childNodes;
元素子节点element.children获取所有元素子节点,返回 HTMLCollectionconst childElements = box.children;
首尾子节点element.firstChild/lastChild获取第一个/最后一个子节点(含文本节点)const first = box.firstChild;
首尾元素子节点element.firstElementChild/lastElementChild获取第一个/最后一个元素子节点const firstEl = box.firstElementChild;
兄弟节点element.previousSibling/nextSibling获取上一个/下一个兄弟节点(含文本节点)const prev = box.previousSibling;
元素兄弟节点element.previousElementSibling/nextElementSibling获取上一个/下一个元素兄弟节点const prevEl = box.previousElementSibling;

二、DOM 操作兼容性指南

📊 兼容性速查表

API 分类具体 API兼容性说明兼容方案
选择器querySelector/querySelectorAll✅ IE8+ 支持(IE8 仅支持 CSS2 选择器)IE8 下避免 CSS3 选择器;低版本 IE 可引入 Sizzle.js
getElementsByClassName❌ IE8- 不支持;✅ IE9+ 支持低版本 IE 用 querySelectorAll('.className') 替代
元素操作element.remove()❌ IE10- 不支持;✅ IE11+ 支持兼容写法:if (el.remove) el.remove(); else el.parentNode.removeChild(el);
innerHTML✅ IE4+ 支持IE8- 中使用 HTML5 标签需先创建元素
textContent❌ IE8- 不支持;✅ IE9+ 支持兼容写法:el.textContent ? el.textContent = text : el.innerText = text;
类名操作classList❌ IE9- 不支持;✅ IE10+ 支持低版本 IE 用 className 拼接或引入 classList.js 垫片
自定义属性dataset❌ IE10- 不支持;✅ IE11+ 支持低版本 IE 用 getAttribute/setAttribute 替代
节点遍历firstElementChild/lastElementChild❌ IE8- 不支持;✅ IE9+ 支持遍历 childNodes 过滤元素节点

🌐 浏览器兼容性总结

浏览器版本核心兼容痛点推荐适配方案
IE6-7getElementsByClassNamequerySelector,不支持 HTML5 标签使用 jQuery 封装 DOM 操作;手动创建 HTML5 标签
IE8仅支持 CSS2 选择器,无 classListdatasetquerySelector 仅用 CSS2 选择器;用 getAttribute/setAttribute 替代 dataset
IE9-10element.remove()classList.toggle封装 remove 方法;引入 classList.js 垫片
IE11+ / 现代浏览器几乎全兼容直接使用标准 DOM API,无需额外适配

三、最佳实践与性能优化

🛡️ 安全实践

  • XSS 防护:优先使用 textContent 替代 innerHTML 设置纯文本内容
  • 输入验证:对用户输入进行严格过滤和转义
  • 内容安全策略:使用 CSP(Content Security Policy)限制脚本执行

⚡ 性能优化

  • 批量操作:使用 documentFragment 减少重排重绘
  • 事件委托:利用事件冒泡减少事件监听器数量
  • 缓存选择:避免重复查询 DOM 元素
  • 最小化操作:减少不必要的 DOM 操作

🔧 兼容性策略

  • 垫片(Polyfill):引入 core-jses5-shim 等库自动补齐缺失 API
  • 渐进增强:优先使用基础 API,高级功能作为增强
  • 特性检测:使用 if (feature) { ... } 判断 API 可用性

四、实用工具函数

🔄 兼容性封装函数

javascript
// 删除元素兼容函数
function removeElement(el) {
    if (el.remove) {
        el.remove();
    } else {
        el.parentNode.removeChild(el);
    }
}

// 设置文本兼容函数
function setText(el, text) {
    if (el.textContent !== undefined) {
        el.textContent = text;
    } else {
        el.innerText = text;
    }
}

// 获取第一个元素子节点兼容函数
function getFirstElementChild(el) {
    for (let i = 0; i < el.childNodes.length; i++) {
        if (el.childNodes[i].nodeType === 1) {
            return el.childNodes[i];
        }
    }
    return null;
}

这是我的个人文档