onerror死循环本质是备用图加载失败反复触发自身,必须在换源后立即执行this.onerror=null切断绑定。内联写法最稳定,需确保备用路径绝对可靠,动态创建元素须提前设置onerror属性。

onerror 死循环本质是备用图也加载失败,触发自身重复执行——必须在换源后立即切断事件绑定,否则浏览器卡死、内存暴涨都是真实发生的。
为什么 onerror="this.src='fallback.png'" 会无限触发
浏览器对 onerror 的处理非常直接:只要资源加载失败(如 404/403/500),就执行该属性里的 JS;如果新 src 仍是无效路径,它会再次失败,再次进入同一段逻辑。这不是 bug,是设计如此。
- 备用图路径必须绝对可靠:用
data:image/svg+xml;base64,...或已确认存在的 CDN 路径,不能是另一个可能 404 的相对路径 -
this.onerror=null必须紧接在赋值之后,顺序不能颠倒,且分号不能省略 - 空字符串、
undefined、纯空格或 CORS 阻塞不会触发onerror,所以它只对“发了请求但服务端返回失败状态”有效
onerror 内联写法才是唯一跨浏览器稳定的方案
动态绑定(比如 img.onerror = handler 或 addEventListener('error', ...))在旧版 Safari 和部分 Edge 中可能完全不触发。SSR 页面首屏加载失败时,JS 还没执行,内联写法是唯一能兜底的方式。
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
- 静态 HTML 必须写成:
onerror="this.src='/assets/placeholder.svg'; this.onerror=null;" - 动态创建的
img元素,要在插入 DOM 前手动设置onerror属性,不能靠后续 JS 补绑 - 框架中(如 Vue/React)的
@error或onError是封装层,最终仍要落到 DOM 层的内联或属性赋值上
需要重试多次?必须带路径判断和计数
原生 onerror 只触发一次,没法自动重试。真要多级降级(原始 URL → CDN 备份 → 本地 → SVG 占位),就得自己控制流程,防止绕过防重逻辑。
立即学习“前端免费学习笔记(深入)”;
- 推荐写法:
onerror="if (!this.src.includes('fallback')) { this.src = '/cdn/logo.png'; this.onerror=null; } else if (!this.src.includes('local')) { this.src = '/assets/logo.png'; this.onerror=null; } else { this.src = 'data:image/svg+xml;base64,...'; this.onerror=null; }" - 更稳妥的做法是把逻辑抽到函数里,用
data-retry-count记录次数,第 3 次直接设透明图并移除onerror - 不要依赖 class 名或 DOM 位置来识别目标元素,要用
data-id或data-retry-key做显式绑定
最常被忽略的一点:防死循环不是“建议”,而是硬性前提。哪怕只是临时调试加了一行 onerror="this.src='xxx'",只要 xxx 不在本地或未部署,切到测试环境就可能让整个标签页无响应。


















