onerror 卡死因备用图404导致无限重试,防死循环须同时标记已处理并立即解绑事件;备用图优先用内联SVG,绝对路径更可靠;动态插入图片需在appendChild前绑定error事件。

onerror 为什么一写就卡死?
因为备用图也 404 时,onerror 会无限重试:新 src 加载失败 → 再触发 onerror → 再换 src……最终内存暴涨或页面无响应。这不是偶发问题,而是只要降级路径不可靠,100% 触发。
防死循环的硬性写法
必须同时满足两个条件:标记已处理 + 立即切断事件绑定。缺一不可。
onerror="if (!this.dataset.loaded) { this.dataset.loaded = '1'; this.src = '/img/placeholder.svg'; this.onerror = null; }"- 备用图优先用内联 SVG:
data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAiIGhlaWdodD0iMzAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==,彻底规避路径风险 - 绝对路径优于相对路径:
/img/fallback.png比./fallback.png可靠,避免 file:// 协议下解析到系统根目录
动态插入的 img 怎么安全绑定 onerror
如果先 appendChild() 再赋值 onerror,首次加载失败已发生,事件直接丢失。必须在插入 DOM 前完成绑定。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 用
addEventListener('error', handler)替代内联属性,避免字符串拼接和执行上下文错乱 - 静态 HTML 中可加
data-id标识:
- 动态创建时,推荐提前定义 handler:
const img = document.createElement('img');<br>img.addEventListener('error', e => {<br> if (!e.target.dataset.fallbacked) {<br> e.target.src = 'data:image/svg+xml;base64,...';<br> e.target.dataset.fallbacked = 'true';<br> }<br>});
哪些情况 onerror 根本不触发?
它只响应网络层失败(404 / 403 / 500),对以下场景完全沉默:
-
src是空字符串、undefined或纯空格 —— 浏览器不发请求 - CORS 阻塞(跨域图片没配
crossorigin)—— 控制台报错但onerror不进 - 服务器返回 200 的兜底页(如 CDN 的“图片不存在”占位图)—— 浏览器认为成功
- 图片文件头正常但数据损坏(
naturalWidth === 0才能检测,需额外 JS)
真正容易被忽略的是:所有降级逻辑都依赖“真实网络失败”这个前提;一旦服务端返回 200 状态码的错误内容,onerror 就彻底失效,必须配合后端约定或 JS 层二次校验。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










