onerror无限触发因fallback资源也404导致死循环,须用dataset.retries限次、清空src防缓存、内联图避二次失败;script/link靠全局计数器控重试;fetch需abortcontroller+退避策略防堆积。

onerror 本身不区分超时和404,但循环重试必须设上限,否则页面卡死或内存暴涨
为什么 onerror 会无限触发
常见错误是写成 onerror="this.src='fallback.jpg'",而 fallback 资源也 404 时,浏览器再次触发 onerror,形成死循环。这不是 bug,是事件机制的自然结果。
关键点在于:this.dataset.loaded 必须在首次触发时就标记,且不能只靠 this.onerror = null —— 动态插入的元素可能多次绑定,null 不一定生效。
- 每次触发
onerror前,先检查this.dataset.retries是否已达到阈值(如 3 次) - 未达上限才执行替换逻辑,并递增
this.dataset.retries = (parseInt(this.dataset.retries) || 0) + 1 - 替换前必须清空
this.src = '',否则浏览器可能直接返回缓存的失败响应 - 备用路径建议用
data:image/png;base64,...内联图,彻底规避二次加载失败
script 和 link 标签的重试上限怎么控制
<script></script> 和 <link rel="stylesheet"> 的 onerror 只支持内联书写,无法动态改写逻辑,所以“上限”必须靠状态变量 + 全局计数器实现。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
例如:主资源 app.js 失败后降级到 app.fallback.js,后者再失败就不能再降级——因为没有第三个兜底入口。
- 在
onerror内联脚本中调用统一函数,如handleScriptError(this, 'app') - 函数内部用对象
retryCounts按 pathname 记录次数:retryCounts['/app.js'] = 2 - 超过预设值(如 2)直接跳过赋值,改为执行轻量兜底逻辑(如
initMinimal()) - 不要用 class 名或索引推断目标 script,DOM 变化后极易错位;必须用
this.src或data-key精准识别
fetch 加载 HTML 片段时的超时与重试上限
fetch 本身不触发 onerror,但超时后若手动重试,同样要防循环。关键是 abort + 计数 + 清除旧 DOM。
典型错误:点击按钮反复调用同一 fetch 函数,却没清除上次插入的占位节点,导致结构重复、事件堆积。
- 每次请求前检查容器是否已有
data-status="loading",有则 return - 用
AbortController主动中断 pending 请求,避免多个并发请求积压 - 重试次数按 URL 路径统计,不是按按钮点击次数;同个片段连续失败 3 次,后续点击应禁用按钮
- 成功后必须清理所有错误状态:
el.removeAttribute('data-status')、移除提示节点、恢复原始 innerHTML 结构
最常被忽略的是:重试上限必须和退避策略绑定。比如第一次失败后等 500ms,第二次等 1s,第三次直接终止——单纯计数不加延迟,对 CDN 故障毫无意义。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










