innerHTML开发样例有哪些,怎么用?


写入时,浏览器会解析字符串并构建对应的DOM节点树,这意味着每次设置innerHTML,浏览器都会重新解析字符串并创建节点,如果替换的是一个大型列表,代价会明显上升。
### 字符串拼接的常见误区
很多新手会写出这样的代码:
```javascript
const list = ['苹果', '香蕉', '橙子'];
let html = '';
for (let i = 0; i < list.length; i++) {
  html += '<li>' + list[i] + '</li>';
}
document.getElementById('fruitList').innerHTML = html;

这种写法在数据量小的时候没问题,但当列表项达到数百甚至上千时,每次循环拼接字符串都会产生中间变量,内存占用和GC压力随之增加,推荐的做法是使用join方法:

const list = ['苹果', '香蕉', '橙子'];
const html = list.map(item => '<li>' + item + '</li>').join('');
document.getElementById('fruitList').innerHTML = html;

innerHTML的性能边界与优化思路

性能问题不是凭感觉猜测的,这里有一个行业共识:在相同操作下,innerHTML的写入速度通常比createElement+appendChild方案慢,但在整体代码可读性和简便性上明显占优,具体差距和浏览器实现、DOM深度、节点数量都有关系。

【js教程】122_DOM_innerHTML属性(掌握)
加载中
【js教程】122_DOM_innerHTML属性(掌握)

哪些场景下性能差异明显

  • 一次性渲染大量静态内容:比如首屏落地页的骨架结构,innerHTML的解析开销可以接受。
  • 频繁小范围更新:比如用户输入触发局部刷新,建议避免使用innerHTML,改用textContent或直接操作目标节点。
  • 表格或列表的批量重绘:如果每次请求回来都整体替换tbody的innerHTML,页面会明显卡顿。

性能优化实操步骤

  1. 先清空容器,再设置innerHTML,避免累积旧节点。
  2. 将拼接好的HTML字符串一次性赋值,不要分多次赋值,包含大量重复模板,优先考虑

    innerHTML开发样例有哪些,怎么用?

    DocumentFragmentcreateElement方案。

  3. 使用requestAnimationFrame或宏任务调度,避免阻塞主线程。

业内专家指出,前端性能优化的核心不是选一个万能工具,而是根据操作频率和DOM规模,选择成本最低的方案。

innerHTML与XSS攻击的攻防细节

提到innerHTML,XSS是绕不开的话题,设置innerHTML时,字符串中的<script>标签不会执行,但事件属性比如onerroronclick会触发,这是最容易踩的坑。

实际攻击场景示例

const username = '<img src=x onerror="alert(1)">';
document.getElementById('profile').innerHTML = username;

上面的代码在设置innerHTML之后,浏览器加载图片失败,触发onerror事件,弹窗就出现了,这在评论区、用户昵称展示等场景中是真实存在的风险。

防御方案对比

方案 原理 适用场景
textContent 不解析HTML,纯文本输出 所有用户输入内容
转义尖括号 <替换为&lt; 需要保留部分HTML格式时
DOMPurify等库 白名单过滤标签和属性 富文本编辑器场景
服务端校验 入库前过滤危险字符 数据源头控制

近几年,前端框架逐步普及,React的dangerouslySetInnerHTML、Vue的v-html本质都是innerHTML的封装,同样存在XSS风险。业务代码中,凡是涉及用户输入的内容输出,一律默认走textContent,除非你能明确确认内容经过严格过滤

innerHTML开发样例有哪些,怎么用?

innerHTML与textContent、insertAdjacentHTML的选型对比

很多开发者会问,innerHTML和textContent到底选哪个?这里给出一个判断标准:目标是纯文本就选textContent,目标是HTML结构才选innerHTML

innerHTML和textContent区别

textContent只处理文本内容,不解析HTML标签,它不会触发图片加载、样式渲染或脚本事件,性能上比innerHTML更稳定,安全性也高得多,修改文本时,比如更新商品价格、用户昵称、消息内容,textContent是更合适的选择。

insertAdjacentHTML的补充定位

insertAdjacentHTML提供四个插入位置:beforebeginafterbeginbeforeendafterend,它和innerHTML的区别在于,不需要先获取容器再整体替换,可以在指定位置插入节点,同时避免影响已有子节点。

// 在列表末尾追加一项
const list = document.getElementById('list');
list.insertAdjacentHTML('beforeend', '<li>新项目</li>');

对比来看,insertAdjacentHTML更适合局部增量更新,innerHTML则适合整体替换,从性能角度,insertAdjacentHTML避免了序列化整个容器的开销,在列表追加场景下更高效。

innerHTML在真实业务场景中的最佳实践

上面讲了很多技术细节,接下来落到实际业务操作中,以常见的后台管理系统为例,表格数据刷新、弹窗内容填充、TAB切换这三个场景,对innerHTML的依赖程度各不相同。

表格数据刷新

表格每页显示20条数据,点击翻页时直接替换整个tbody的innerHTML,这种操作频率较低,数据量可控,性能影响可以忽略,但需要注意,如果表格行内包含事件绑定,替换后事件会丢失,需要使用事件委托或重新绑定。

填充

一般是固定的模板,配合模板字符串使用,可读性非常好:

innerHTML开发样例有哪些,怎么用?

const modal = document.getElementById('modal');
modal.innerHTML = `
  <h3>${data.title}</h3>
  <p>${data.content}</p>
  <button class="btn-confirm">确认</button>
`;

这里要注意,data.titledata.content如果是服务端返回的,必须经过转义处理,否则等于把XSS漏洞直接暴露在线上。

动态渲染业务组件

现在很多项目使用Vue或React,但偶尔也会在原生场景下使用innerHTML,比如通过后端下发的JSON配置,动态渲染表单或图表,这种场景下,推荐使用html模板工具库或自定义渲染函数,而不是简单拼接字符串,否则代码维护成本会急剧上升。

innerHTML常见问题解答

innerHTML和textContent在性能上差距有多大?

没有绝对量化的差距,取决于内容规模和浏览器引擎,小规模文本更新,两者几乎无差别;大规模列表渲染,innerHTML的解析开销更明显,从安全性角度,textContent完全规避了XSS风险,所以纯文本场景优先选择textContent。

innerHTML读取的HTML字符串和原始源码一致吗?

不一致,浏览器会序列化当前DOM结构,补全缺失的标签、转换属性引号、统一标签大小写,比如原始源码中写<img src='a.jpg'>,读取innerHTML可能得到<img src="a.jpg">,所以不要依赖innerHTML做源码级别的字符串比较。

使用innerHTML时如何避免XSS攻击?

核心原则是:用户输入内容不直接进入innerHTML,如果必须使用,先对特殊字符进行转义,将&<>、、转换为HTML实体,富文本场景引入白名单过滤库,服务端配合做输入校验,前端再做输出转义,形成双层防护。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://test.idctop.com/article/557613.html

(0)
5s链接激活服务器失败怎么办,是什么原因
上一篇 2026年8月8日 20:45
IndexedDB怎么用,与localStorage哪个好?
下一篇 2026年8月8日 20:48

相关推荐

  • 分布式数据库和云的区别是什么,如何选择?

    分布式数据库和云已经不再是非此即彼的选择题,而是企业构建高可用、弹性扩展数据架构的必然组合, 无论是传统数据库上云,还是原生分布式数据库,核心都在于利用云基础设施实现计算与存储的分离,从而获得弹性伸缩和故障自愈能力,分布式数据库和云原生数据库的区别:选型必须搞清楚的3个关键点很多企业都在纠结“分布式数据库”和……

    2026年7月27日
    600
  • IDEA常用快捷键有哪些,快捷键功能简介怎么用?

    掌握IntelliJ IDEA的常用快捷键,能让你的编码效率显著提升,但核心在于系统化整理与坚持练习,而非零散记忆,IDEA常用快捷键分类详解IDEA代码补全快捷键与编辑操作代码编辑是日常开发的核心,IDEA的编辑快捷键能让你在编码时保持流畅,减少鼠标切换,Ctrl+空格:基础代码补全,这是IDEA代码补全快捷……

    2026年8月20日
    500
  • ip即系、FunctionGraph与IaC是什么?,怎么用

    ip即系_FunctionGraph和基础设施即代码(IaC)的结合,意味着用代码定义和管理函数计算资源,实现自动化部署、版本控制和环境一致性,这是现代云原生运维的必由之路,为什么需要将FunctionGraph纳入IaC管理传统函数管理方式依赖控制台手动操作,运维人员需要登录华为云,逐个创建函数,选择运行时……

    AI资讯 2026年8月9日
    700
  • 服务器能主动给客户端发信息吗,服务端推送消息原理

    可以,服务器不仅能给客户端发信息,而且在现代Web架构中,这是实现实时交互的核心能力,过去我们习惯让客户端像勤快的学生一样,不停地举手问老师“有作业吗”,这种轮询方式效率极低且浪费资源,老师(服务器)可以直接把作业本(数据)塞到学生(客户端)手里,这就是所谓的“服务器主动推送”,这种机制彻底改变了互联网应用的信……

    2026年7月5日
    12000
  • 服务器租用哪里比较好?,一年费用多少钱?

    服务器租用,核心是匹配业务需求,综合预算、性能、网络稳定性与服务支持,选择主流云服务商或资质齐全的IDC厂商即可, 但具体到“哪里好”,需要从服务商资质、机房等级、网络延迟、售后响应等维度逐一对比,而非仅凭价格或广告决定,服务器租用哪个好?核心评估维度选择服务器租用,服务商的底层基础设施决定业务上限,行业共识认……

    AI资讯 2026年7月17日
    1500
  • 分布式缓存软件怎么选?分布式缓存软件有哪些

    分布式缓存软件是现代高性能应用架构中的核心组件,主要用于减轻数据库压力、提高数据读取速度以及实现会话共享等功能,以下是目前市场上主流、成熟的分布式缓存软件分类及详细介绍,涵盖开源方案和商业方案: 主流开源分布式缓存Redis (最主流)特点:基于内存的 Key-Value 存储,支持多种数据结构(String……

    2026年7月12日
    17400
  • 大模型的上下文窗口如何扩展?大模型上下文窗口限制怎么解决

    扩展大模型上下文窗口的核心在于突破传统注意力机制的计算瓶颈,通过优化KV缓存管理、引入长文本压缩算法及采用混合检索架构,实现从“线性堆叠”到“智能聚焦”的技术跃迁,在2026年的AI应用生态中,大模型处理超长文档的能力已成为企业级应用的分水岭,许多开发者曾困惑于为何模型在处理超过数万token的内容时会出现“遗……

    2026年6月21日
    2600
  • vLLM部署报错怎么排查?vLLM部署常见报错解决方法

    vLLM部署报错时,最核心的排查逻辑是遵循“环境依赖-显存资源-模型配置-网络通信”的递进顺序,优先通过日志定位OOM或版本冲突,再针对性调整参数或升级驱动,在实际的大模型落地场景中,vLLM因其高吞吐和连续批处理特性成为首选,但这也意味着它对底层环境极其敏感,很多开发者在初次部署时,常遇到服务启动失败、推理延……

    2026年6月19日
    2400
  • 防火墙十大品牌都有哪些,哪个牌子性价比高?

    防火墙十大品牌中,Palo Alto Networks、Fortinet、Check Point、华为、深信服等品牌凭借技术成熟度与市场占有率稳居第一梯队,但选型需结合企业规模、合规要求与预算,没有绝对的最好,只有最适合,企业防火墙怎么选?先看品牌格局与选型逻辑很多采购者面对“防火墙十大品牌”列表时反而更困惑……

    2026年7月26日
    2200
  • 服务器虚地址修改的步骤是什么,怎么设置?

    服务器虚地址修改的核心是调整虚拟网络接口的IP配置,无论你用的是Linux的ip命令还是Windows的netsh,操作后都必须验证网络连通性并更新依赖服务,否则可能导致业务中断,服务器虚地址修改的典型场景服务器虚地址常用于高可用集群、多IP绑定和云环境弹性扩展,你问“服务器虚地址修改场景”有哪些,其实多数都集……

    2026年7月23日
    500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注