innerhtml返回含标签的完整html字符串,innertext返回折叠空白、忽略隐藏内容的纯文本;设置时innerhtml解析标签并重建dom,innertext原样显示文本且可能触发重排。

获取和修改 innerHTML 与 innerText 是操作 DOM 元素内容最基础也最常用的手段,但二者用途、行为和安全边界完全不同,用错容易导致显示异常、XSS 风险或语义丢失。
怎么获取 innerHTML 和 innerText
两者都通过元素对象的属性直接读取,语法一致:
-
获取 innerHTML:返回元素内部完整的 HTML 字符串(含标签、换行、空格),包括所有嵌套结构。
const html = element.innerHTML; -
获取 innerText:返回纯文本内容,浏览器会自动忽略标签、折叠空白符、隐藏不可见文本(如
display: none的内容),且不跨浏览器完全一致(非标准,IE 起源)。
例如:<div>
<strong>Hello</strong><br>World</div>
→ innerHTML 得到 "<strong>Hello</strong><br>World"
→ innerText 得到 "Hello World"(中间换行变为空格)。
怎么设置 innerHTML 和 innerText
赋值写法也一样,但效果差异极大:
-
设置 innerHTML:传入字符串会被浏览器解析为 HTML,标签生效,结构重建。原有子节点全部销毁,事件监听器也会丢失。
element.innerHTML = "<p>新段落</p> <span>带样式</span>"; -
设置 innerText:内容被当作纯文本处理,所有尖括号、标签名都会原样显示,不会被解析。
element.innerText = "<p>这不会变成段落</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher"><img src="https://img.php.cn/upload/skill/000/000/081/179109368394970.jpg" alt="Wechat HTML Publisher" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher" class="overflowclass">Wechat HTML Publisher</a> <p class="overflowclass">直接上传HTML富文本到微信公众号草稿箱。支持完整的HTML格式,无需Markdown转换。</p> </div> <a rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>";→ 页面上真的显示“这不会变成段落
”
注意:innerText 在设置时还会触发重排(reflow),性能略低于 textContent;若只需纯文本,更推荐用标准的 textContent 替代。
innerHTML 和 innerText 的关键区别
选哪个,取决于你要什么:
- 要渲染动态 HTML(如模板插入、富文本片段)→ 用
innerHTML,但务必确保内容可信,用户输入必须先转义或使用DOMPurify过滤。 - 只更新文字、避免 XSS、保持语义简洁 → 用
textContent(比innerText更标准、更快、更可预测)。 - 需要模拟用户真实“看到的文本”(比如计算可见字数、适配屏幕阅读器逻辑)→ 才考虑
innerText,但需注意兼容性与性能代价。
常见误用与建议
几个高频踩坑点:
- 用
innerHTML渲染用户评论却不做转义 → 可能执行恶意脚本。 - 用
innerText更新表单提示,结果在 Firefox 中换行异常、在 Safari 中隐藏了某些文本。 - 想清空元素内容却写
element.innerHTML = "",其实更简洁安全的方式是element.textContent = ""。 - 对
<input>或<textarea></textarea>误用innerHTML或innerText→ 应该统一用element.value。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










