HTML页面加载中由于资源重试导致的节点重复挂载异常溯源

云静同学_6649

云静同学_6649

2026-06-19

1033人浏览

原创

资源重试本身不会导致节点重复挂载,问题在于重试后未清理旧状态或校验当前环境是否已就绪,如失败script未移除、初始化无幂等保护、dom操作未加guard等。

html页面加载中由于资源重试导致的节点重复挂载异常溯源

资源重试本身不会直接导致节点重复挂载,但重试逻辑若与 DOM 操作耦合不当,就会触发重复插入、重复初始化、重复事件绑定——最终表现为节点“看起来被挂载了两次”。根源不在重试动作,而在重试后没清理旧状态。

为什么 script 重试后会多出一个同名节点

典型场景是:页面中某个 <script src="widget.js"></script> 加载失败,监听器捕获后动态创建新 <script></script> 并插入 ;而原始 <script></script> 标签仍保留在 DOM 中(浏览器不自动移除失败的 script 标签),后续 widget.js 初始化时又执行了一次 document.body.appendChild(el),结果 el 被 append 两次。

  • 失败的 <script></script> 元素不会被浏览器自动从 DOM 中移除,e.target 依然可访问
  • 若重试逻辑只管“插入新 script”,不管“是否已有同功能模块在运行”,就极易重复执行初始化代码
  • 第三方脚本常自带自执行逻辑(如 IIFE),无法控制其内部是否幂等,重试等于再跑一遍

如何避免重试引发的 DOM 节点重复

关键不是阻止重试,而是让重试动作和 DOM 状态解耦。所有重试后的操作必须先校验当前环境是否已就绪。

html-deploy
html-deploy

使用 htmlcode.fun 将 HTML 内容或文件部署到网页,适用于用户要求“部署到网页”“托管此 HTML”“生成此前端...的实时链接”等场景。

下载
  • 给被加载资源打唯一标记:比如在插入前写 document.documentElement.setAttribute('data-widget-loaded', 'true'),重试前先检查该属性是否存在
  • 初始化逻辑加 guard:用 if (!window.MyWidgetInstance) { window.MyWidgetInstance = new Widget() },避免多次实例化
  • 不要在重试回调里直接操作 DOM,改用事件通知机制:重试成功后 dispatch CustomEvent('widget:loaded'),由独立监听器负责挂载,且只响应一次
  • 对已插入的失败 <script></script>,可在重试前调用 e.target.remove()(注意:仅限捕获阶段能拿到 e.target)

onerror + 动态插入 script 的常见坑

很多方案直接在 <script onerror="retry(this)"></script> 里调用 document.head.appendChild(newScript),这看似简单,却埋下三处隐患:

  • this 在某些压缩工具或 CSP 环境下可能丢失上下文,推荐用 event.target 或传入 src 字符串而非 this
  • 未清除原 script 的 async/defer 属性,新 script 执行时机错乱,可能早于依赖项
  • 重试 URL 未加时间戳或版本参数,CDN 缓存返回旧 404 响应,导致无限重试失败循环
  • 未限制重试次数,retryMaps[<code>new URL(src).pathname] 计数漏初始化,或跨页面未清空,造成误判

真正要监控的不是“重试次数”,而是“挂载状态”

你看到的“节点重复”,90% 是因为前端把“资源加载完成”错误等价于“功能已就绪”。而实际中,JS 加载成功 ≠ 执行完毕 ≠ DOM 插入完成 ≠ 事件绑定生效。

  • 用 performance.getEntriesByName('widget.js', 'resource') 查真实加载耗时,比监听 load 事件更准
  • 初始化完成后手动设置 data-initialized="true" 到对应容器节点,后续所有操作都以该属性为判断依据
  • 对 iframe 或第三方 widget,用 window.frames[i].postMessage 等待对方确认 ready,而不是靠 setTimeout 猜测

节点重复挂载从来不是重试机制的问题,而是状态管理缺失的副产品。重试只是暴露了那个一直没被发现的竞态条件。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

html

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

5355

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3092

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

2750

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

2779

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4679

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

2741

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

2529

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2288

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2268

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
jQuery官方API文档
jQuery官方API文档

共0课时 | 0人学习

DOM操作与实战案例
DOM操作与实战案例

共14课时 | 2.3万人学习

前端系列快速入门课程
前端系列快速入门课程

共4课时 | 0.5万人学习