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开发样例有哪些,怎么用?

    DocumentFragment或createElement方案。

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

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

innerHTML与XSS攻击的攻防细节

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

实际攻击场景示例

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提供四个插入位置:beforebegin、afterbegin、beforeend、afterend,它和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.title和data.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://idctop.com/article/557613.html

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

相关推荐

  • IP访问8080打不开CodeArts首页?,如何解决?

    通过IP地址加8080端口直接访问CodeArts Pipeline首页,关键在于确认服务监听配置、防火墙规则与安全组策略均已正确放行,为什么需要通过IP访问CodeArts Pipeline首页?在实际开发运维中,通过IP访问CodeArts Pipeline首页是一个很常见的需求,比如你在本地开发环境搭建了……

    2026年8月20日
    300
  • IE10浏览器怎么添加常用网站,具体步骤是什么?

    在IE 10浏览器中,添加常用网站的核心方法是通过收藏夹功能和新标签页的快速导航设置,操作简单,只需几步即可完成,无论你是日常办公还是偶尔使用,掌握这些技巧能让你的浏览效率明显提升,下面我会从最基础的操作开始,逐步深入到常见问题,带你彻底搞懂IE 10的常用网站添加方法,IE 10浏览器添加常用网站怎么设置?两……

    2026年8月13日
    1300
  • AI模型不止于大,除了大模型还有哪些应用场景

    AI模型的价值早已不再单纯取决于参数规模,而是取决于其能否在垂直场景中实现低成本、高精准的落地应用,从“大而全”到“小而美”的范式转移过去几年,行业陷入了一种参数军备竞赛的误区,仿佛只有万亿级参数的模型才能代表智能的巅峰,随着算力成本的攀升和应用场景的碎片化,这种“唯大小论”正在被打破,业内专家指出,模型能力的……

    2026年6月13日
    5400
  • 如何获取IdeaHub定制类型,有哪些类型?

    获取IdeaHub定制类型,本质是通过设备系统信息或查询接口确认当前设备所属的行业定制版本,从而匹配对应的功能与服务,如何获取IdeaHub定制类型?获取定制类型的方式有几种,从简单到专业,你可以根据自身条件选择,通过设备界面直接查看这是最直接的方法,在IdeaHub主屏幕,按以下路径操作:进入 设置 或 系统……

    2026年8月20日
    700
  • 福建云数据库哪家好?2026年福建云数据库价格及对比

    福建云数据库是本地企业实现数据资产化、业务数字化的核心基础设施,它通过提供高可用、低延迟且符合合规要求的存储方案,直接解决了传统服务器维护成本高、数据安全风险大的痛点,在数字化转型的深水区,数据不再仅仅是记录,而是驱动业务增长的核心燃料,对于身处福建的企业而言,选择一款合适的云数据库,意味着选择了更高效的生产力……

    2026年7月6日
    16800
  • IT系统集成项目如何选择靠谱服务商,哪家好?

    IT系统集成是将硬件、软件、网络、数据等多个异构子系统整合为统一协同平台的专业服务,它直接决定企业数字化项目的落地质量与长期运维成本,IT系统集成是什么?——从概念到边界系统集成的核心定义与价值系统集成不是简单的设备堆砌,而是通过设计、开发、调试,将不同厂商、不同协议的软硬件模块组合成一个能高效运行的整体,它的……

    2026年8月17日
    1400
  • Ollama并发数怎么设置?Ollama配置最大并发请求数

    Ollama设置并发的核心在于调整系统环境变量OLLAMA_MAX_LOADED_MODELS和OLLAMA_NUM_PARALLEL,直接控制模型加载数量与并行请求处理数,无需修改代码即可生效,在本地部署大语言模型时,很多开发者都会遇到“显存爆了”或者“请求排队太久”的困扰,这通常不是模型本身的问题,而是并发……

    2026年6月19日
    4400
  • IIS设置数据库连接池怎么配置?,有哪些注意事项?

    IIS数据库连接池设置的核心在于连接字符串的Pooling参数与应用程序池回收策略的协同配合,正确配置可大幅提升数据库访问效率,避免连接超时与资源耗尽,IIS连接池设置方法:连接字符串是关键大多数开发者容易忽略一个问题:IIS本身并不直接管理数据库连接池,连接池是由ADO.NET在应用程序层实现的,这意味着,你……

    2026年8月7日
    3500
  • 服务器硬盘序列号怎么看?,linux怎么查硬盘sn码?

    服务器硬盘序列号可以通过操作系统命令、硬件管理工具或物理标签三种方式获取,具体操作因操作系统和服务器品牌而异,运维人员应至少掌握命令查询和远程管理两种方法,服务器硬盘序列号怎么查看?三种主流方法详解通过操作系统命令查询序列号这种方法无需额外工具,直接登录系统即可执行,适用于单台或少量服务器,Linux系统:hd……

    AI资讯 2026年7月18日
    3500
  • 大模型本地部署用什么框架最好?本地部署大模型哪个框架好用

    在2026年的技术语境下,若追求极致的本地化隐私控制与低延迟响应,Ollama配合Llama 3或Qwen 2.5模型是个人开发者的最佳起点;若需企业级高并发与复杂工作流编排,则LangChain结合vLLM推理引擎是更稳健的选择,本地部署大模型早已不再是极客的专属玩具,它正迅速成为数据敏感型企业和个人创作者的……

    2026年6月20日
    4110

发表回复

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