JS 获取 DOM 元素信息属性详解

169 阅读2分钟

在前端开发中,操作 DOM 元素的内容是日常任务之一。然而,面对 textContentinnerTextinnerHTMLnodeValue 等属性,很多开发者常常混淆它们的用途和行为差异。本文将带你深入理解这些属性及方法的使用方式、性能差异与兼容性陷阱。

一、内容获取属性详解

属性/方法是否解析 HTML是否包含隐藏元素备注
textContent标准属性,推荐用于获取纯文本
innerText会触发重排,非标准但兼容性好
innerHTML可解析 HTML,存在 XSS 风险
nodeValue适用于文本节点,元素节点返回 null

1. textContent:获取纯文本内容(推荐)

const div = document.querySelector('.box');
console.log(div.textContent); // 获取所有文本,包括 <script> 和 <style> 内容
  • 包含隐藏元素(如 display: none)的文本
  • 不解析 HTML,安全可靠
  • 性能优于 innerText

2. innerText:获取“可见”文本(考虑样式)

console.log(div.innerText); // 只返回用户可见的文本
  • 会触发重排(reflow),性能差
  • 忽略 display: nonevisibility: hidden 的元素
  • 更贴近用户实际看到的文本

3. innerHTML:获取或设置 HTML 字符串

console.log(div.innerHTML); // 返回 HTML 字符串
div.innerHTML = '<span>新内容</span>'; // 会解析 HTML
  • 存在 XSS 风险,避免直接插入用户输入
  • 适合动态渲染 HTML 模板

4. nodeValue:用于文本节点

const textNode = div.firstChild;
console.log(textNode.nodeValue); // 获取文本节点的内容
  • 性能高,仅适用于文本节点
  • 对元素节点返回 null

二、属性获取方法详解

1. getAttribute():获取任意属性值

const link = document.querySelector('a');
console.log(link.getAttribute('href')); // 返回属性值字符串
  • 可获取自定义属性(如 data-*
  • 返回字符串,即使属性是布尔值(如 disabled

2. dataset:获取 data-* 自定义属性

<div id="user" data-id="123" data-role="admin"></div>
​
<script>
  const user = document.getElementById('user');
  console.log(user.dataset.id);   // "123"
  console.log(user.dataset.role); // "admin"
</script>
  • 语法简洁,自动驼峰化(如 data-user-namedataset.userName
  • 仅适用于 data-* 属性

3. 直接属性访问(如 hrefsrc

const img = document.querySelector('img');
console.log(img.src); // 返回完整 URL(已解析)
  • 返回解析后的绝对路径
  • 无法获取自定义属性

三、实战建议与最佳实践

场景推荐方式
获取纯文本内容textContent
获取用户可见文本innerText(注意性能)
动态插入 HTMLinnerHTML(务必转义用户输入)
获取自定义属性datasetdata-*)或 getAttribute()
获取标准属性直接访问属性(如 img.src

四、总结速记口诀

  • 文本用 textContent,可见用 innerText
  • HTML 用 innerHTML,节点用 nodeValue
  • 属性用 getAttribute,自定义用 dataset

五、附录:速查表(保存备用)

目标方法/属性
获取所有文本(含隐藏)textContent
获取可见文本innerText
获取 HTML 字符串innerHTML
获取文本节点内容nodeValue
获取任意属性getAttribute()
获取 data-* 属性dataset
获取标准属性.src.href