根本原因是fallback图404导致onerror递归触发;必须先设新src再执行this.onerror=null,且fallback路径须绝对可靠,否则仍会白屏或静默失败。

onerror 无限循环根本原因是 fallback 图也 404
浏览器加载原始 src 失败后触发 onerror,如果指定的备用图(比如 'default.png')本身又 404,会再次触发 onerror,形成递归。这不是代码“没写对”,而是 fallback 资源不可达导致的链式失败。内存持续增长,页面可能卡死或标签页无响应。
必须写成 this.onerror=null,且顺序不能错
这是跳出循环的硬性操作,不是可选项。关键点在于赋值新 src 和清除事件监听必须在同一次执行中完成:
-
onerror="this.src='/assets/placeholder.svg'; this.onerror=null;"✅ 正确:先换源,再切断 -
onerror="this.onerror=null; this.src='/assets/placeholder.svg';"⚠️ 风险:若备用图加载极慢,中间有微小窗口可能被重复触发(尤其在低性能设备) -
onerror="this.src='default.png'"❌ 卡死:没切断,二次失败即死循环
fallback 图路径必须绝对可靠
即使 this.onerror=null 写对了,如果备用图地址本身解析失败(如相对路径拼错、协议缺失、CDN 未部署),浏览器仍会静默阻止第二次 onerror 触发——此时你看到的是白屏或 alt 文字,但控制台没报错,调试极其困难。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 优先用绝对路径:
/images/placeholder.svg或完整 URL:https://cdn.example.com/placeholder.svg - 更稳妥用内联 base64 SVG:
data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAiIGhlaWdodD0iMzAi...,彻底绕过网络请求 - 避免使用
./、../等易受 base URL 影响的相对路径 - 动态插入的
元素,onerror必须在appendChild()前绑定,否则首次错误已发生,事件直接丢失
onerror 不是万能的,它不响应这些情况
很多人以为加了 onerror 就万事大吉,其实它只捕获“发出请求后返回非 2xx 状态码”的失败。以下场景它完全沉默:
-
src为空字符串、undefined或纯空格 —— 浏览器根本不发请求 - CORS 阻塞(跨域图片没加
crossorigin属性)—— 控制台报错,但onerror不触发 - 服务器返回 200 状态码的兜底页(如某些 CDN 的“404 页面”)—— 浏览器认为“加载成功”
- 图片文件头正常但内容损坏(如 JPEG 数据块坏)—— 需靠
img.naturalWidth === 0配合 JS 检测
真正鲁棒的方案,得把 onerror 当作其中一层,配合 格式降级、预加载 fallback、服务端首屏资源校验一起用。最常被忽略的,其实是 fallback 图本身的可用性验证——上线前手动访问一遍 /assets/placeholder.svg,比写十遍 this.onerror=null 更管用。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










