必须在onerror中立即执行this.onerror=null或清空src再赋值,否则备用图加载失败会再次触发onerror形成死循环;推荐优先使用this.onerror=null并配合绝对路径或base64占位图。

onerror 触发后 src 赋值又触发 onerror 怎么办
直接改 src 会再次触发 onerror,形成死循环。根本原因是:浏览器把“设置一个无效/404 的 src”也当作一次资源加载失败,只要新值仍无法加载,就继续回调。
- 最稳妥的做法是先清空
src(设为''或'about:blank'),再赋值备用图 URL - 或者用
srcset+sizes配合loading="lazy"降低初始加载失败概率,但不解决 onerror 本身 - 更推荐在触发时移除
onerror事件监听器,避免重复进入 —— 尤其适合内联写法
内联 onerror 写法里怎么安全替换图片
很多人这么写:,一旦 
b.jpg 也 404,立刻死循环。关键在于:内联 handler 没有上下文控制能力,无法“只执行一次”。
- 改成
this.src = ''; this.src = 'b.jpg';,清空再赋值,可打断多数浏览器的重试逻辑 - 或用
this.onerror = null; this.src = 'b.jpg';,显式卸载监听器,兼容性更好 - 注意:Safari 对
about:blank处理较严格,设为空字符串比设about:blank更稳妥
用 addEventListener 绑定时如何防重入
动态绑定比内联更可控,但默认不会自动解绑,容易因多次触发或组件复用导致重复绑定、多层回调。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 务必在回调里调用
img.removeEventListener('error', handler),确保只响应一次 - 如果图片可能被 JS 多次重置
src(比如列表渲染),建议加个标记属性如data-error-handled="true",检查后再执行替换逻辑 - 不要在 handler 里调用
img.setAttribute('src', ...),优先用img.src = ...,避免触发 attributeChangedCallback 类副作用
备用图也挂了怎么办?得有兜底策略
只换一张图不解决问题。真实场景中,CDN 故障、路径写错、权限限制都可能导致备用图同样 404。
- 二级 fallback:第一次 onerror 换图,第二次 onerror 改成显示文字或占位色块,例如
img.style.background = '#eee'; img.style.color = '#999'; img.textContent = '图片加载失败'; - 服务端可配合返回 SVG 占位图(体积小、抗锯齿、无跨域问题),URL 形如
data:image/svg+xml, - 真正难缠的是某些代理或防火墙会拦截所有图片请求并返回 200 状态码的“错误页面”,此时
onerror根本不触发 —— 这类情况只能靠定时检测naturalWidth === 0来补救
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










