防循环关键在于立即清空 onerror:赋值新 src 后必须立刻执行 this.onerror=null,否则备用图 404 将导致无限触发;相对路径、顺序错误或延迟清除均会引发页面卡死。

onerror 无限循环根本不是阈值问题
浏览器没有提供「onerror 触发次数阈值」这类配置项。所谓“循环宕机”,本质是备用图 src 再次 404,导致事件链未切断——它不是可调参数的异常,而是必须靠代码逻辑主动终止的行为。
唯一有效的防循环写法:赋值后立刻清空 onerror
只要新 src 不可靠,this.onerror=null 就不是“建议”,而是硬性前提。漏掉或顺序错位,页面大概率卡死或白屏。
-
onerror="this.src='/fallback.svg'; this.onerror=null;"✅ 正确:分号分隔、顺序固定、绝对路径 -
onerror="this.onerror=null; this.src='/fallback.svg';"❌ 错误:事件已清空,换图不生效 -
onerror="this.src='fallback.png'"❌ 高危:相对路径易 404,无终止逻辑,极易循环 - 用
data:image/svg+xml;base64,...替代外部文件 ✅ 彻底规避路径风险
动态创建的 ![]()
必须提前绑定 onerror
JS 创建图片时,错误可能在插入 DOM 前就发生。等 appendChild() 完再绑 onerror,事件直接丢失。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- ❌ 错误:
const img = new Image(); img.src = url; container.appendChild(img); img.onerror = handler; - ✅ 正确:
const img = new Image(); img.onerror = () => { img.src = '/placeholder.svg'; img.onerror = null; }; img.src = url; container.appendChild(img); - 更稳妥:用
dataset标记状态,避免重复降级:if (!this.dataset.fallbacked) { this.dataset.fallbacked = '1'; this.src = '...'; }
为什么 document.addEventListener('error') 不适合图片兜底
图片加载失败事件不冒泡,document.addEventListener('error') 默认捕获不到;即使开启捕获阶段(第三个参数设为 true),也仅能覆盖部分场景,且无法修改 的行为。
- ✅ 可行:
document.addEventListener('error', e => { if (e.target.tagName === 'IMG' && !e.target.dataset.handled) { e.target.dataset.handled = '1'; e.target.src = 'data:image/svg+xml;base64,...'; } }, true) - ⚠️ 注意:该监听对 CORS 阻塞、空
src、200 状态兜底页完全静默,不能替代内联onerror - ❌ 不要依赖:
window.onerror或未加true的document.addEventListener('error'),它们对图片加载失败基本无效
关键点在于:防循环不靠“限次数”,而靠“断链路”。this.onerror=null 是唯一被所有主流浏览器稳定支持的切断方式,且必须在赋值 src 后立即执行——任何延迟、封装或条件判断都可能让这一步失效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










