HTML元素的textContent和innerText两个属性的差别

差别一:隐藏元素是否返回

textContentinnerText 的核心差别在于:前者返回的是"原始文本内容",后者返回的是"渲染后可见的文本"

html 复制代码
 <!DOCTYPE html>
 <html>
 <body>
  <div id="demo">
  第一行
  <span style="display:none">隐藏内容</span>
  <span style="visibility:hidden">不可见</span>
  第二行
</div>
<script>
const el = document.getElementById('demo');

console.log(el.textContent);
// 输出(保留换行和缩进):
// "\n    第一行\n  隐藏内容\n  不可见\n  第二行\n"

console.log(el.innerText);
// 输出(只保留可见文本,并规范化空白):
// " 第一行 第二行"
</script>
</body>
</html>

差别二:是否对空白进行规范化处理

innerText 会对空白进行规范化(多个空格/换行合并为一个空格),textContent 则原样保留。

差别三:执行效率

innerText 的返回值依赖于元素的渲染状态。为了知道哪些内容"可见"、空白该如何规范化,浏览器可能需要重新计算布局(reflow),所以它读取效率较低,不适合在循环或高频操作中使用。

textContent 只是拼接 DOM 树里的文本节点,不关心 CSS,读起来快得多。

差别四:对元素内部定义的CSS样式结点与脚本结点的处理不同

textContent 会把元素内部定义的 <script><style> 里的文本也读出来,innerText 不会。

html 复制代码
 <!DOCTYPE html>
 <html>
 <body>
  <div id="demo">
  可见文字
  <script>console.log('hi')</script>
  <style>.a{color:red}</style>
</div>
<script>
const el = document.getElementById('demo');

console.log(el.textContent);
// 输出(保留换行和缩进):
// "\n  可见文字\n  console.log('hi')\n  .a{color:red}\n"

console.log(el.innerText);
// 输出(只保留可见文本,并规范化空白):
// " 可见文字"
</script>
</body>
</html>

差别五:写入行为不同

javascript 复制代码
el.textContent = 'a\nb';   // 换行会被当作纯文本,显示为 "a b"(HTML 里换行不生效)
el.innerText = 'a\nb';     // 换行会被转换成 <br>,真正显示为两行

小结

维度 textContent innerText
定义来源 DOM 标准 HTML 标准(更偏渲染)
隐藏元素内容 包含 不包含
空白处理 原样保留 规范化(类似浏览器显示效果)
<br> 换行 不体现 体现为换行
性能 快(不触发重排) 慢(可能触发重排/回流)
script/style 返回其文本 不返回
相关推荐
咸鱼老弟4 小时前
Speculative Decoding(投机采样):大模型"先猜后验",生成速度翻倍
前端·算法·ai编程
a1117764 小时前
网页版「MATLAB」开源
前端·开源
JianZhen✓4 小时前
解决SPA发版旧版本残留+动态路由打包失效的完整方案(附落地代码)
前端·状态模式
计算机魔术师4 小时前
Dario Amodei 发文呼吁放缓前沿 AI 开发后各方表态汇总
前端
anyup4 小时前
仍然是简单一句话,uView Pro Starter 一键清理 Skill 发布
前端·人工智能·uni-app
福兮说5 小时前
纯前端把图片压缩到指定体积:canvas.toBlob 配合二分查找
前端·javascript·canvas·图片处理
是立不是利5 小时前
CSS 入门与进阶:从选择器到响应式布局的完整指南
前端·css
镭立智能制造5 小时前
电线电缆换线频繁?MES系统如何缩短换线时间40%
前端·制造
Amos_Web6 小时前
Rspack 源码解析(五):CodeGenerationPass 与模块代码生成
前端·前端框架·源码阅读