onerror仅在图片真实加载失败(如404、跨域拒绝、格式错误)时触发,必须写成onerror="this.onerror=null; this.src='fallback.png'"防无限循环,内联写法最可靠,动态插入需提前绑定或全局捕获。

图片加载失败时如何触发 onerror 回调
浏览器原生支持图片加载失败后的降级处理,关键在于 <img> 标签的 onerror 事件。它只在图片资源返回 404、500、跨域拒绝、格式错误或路径为空等真实加载失败时触发,**不会**在图片加载成功但尺寸为 0、透明或 CSS 隐藏时触发。
常见误用是把 onerror 写成字符串形式(如 onerror="this.src='fallback.jpg'")后反复执行——因为降级图本身如果也加载失败,会再次触发 onerror,造成无限循环。必须在回调中先清除事件绑定:
@@##@@
-
this.onerror=null是必须步骤,否则 fallback 图出错会再次进入该 handler - 不要在
onerror中调用可能再次触发该事件的函数(比如未加防护的loadFallback()) - 内联写法适合简单场景;复杂逻辑建议用
addEventListener('error', ...)并在回调里移除监听器
使用 loading="lazy" 时 onerror 是否仍有效
有效,但有延迟触发风险:懒加载图片在进入视口前不会发起请求,因此 onerror 也不会提前触发。一旦开始加载且失败,事件照常触发。
真正的问题在于——如果懒加载图加载失败,用户滚动到它位置时看到的是空白或占位符,体验断层。此时仅靠 onerror 替换 src 不够,还需确保 fallback 图能立即渲染:
- fallback 图应体积小、格式兼容(推荐
.png或.jpg,避免 WebP 在旧浏览器解码失败) - 避免 fallback 图也设
loading="lazy",否则可能二次延迟 - 若 fallback 图需从 CDN 加载,确保其 URL 稳定且无重定向链路(302 可能被拦截或超时)
现代方案:用 <picture></picture> + <source></source> 做多格式降级
<picture></picture> 本身不处理“加载失败”,但它能按格式支持度、媒体条件、网络能力等前置筛选资源,从源头减少错误概率。真正的错误回退仍要靠内部 <img src="photo.jpg" onerror="this.onerror=null; this.src='fallback.png'"> 的 onerror。
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
典型组合用法:
<picture><source srcset="photo.avif" type="image/avif"><source srcset="photo.webp" type="image/webp"> @@##@@ </source></source></picture>
- 浏览器按
<source></source>顺序尝试加载,首个支持且可访问的格式生效 - 所有
<source></source>都加载失败(如全部 404),才会退到<img>的src - 所以
onerror仍要写在<img src="photo.jpg" onerror="this.onerror=null; this.src='placeholder.svg'" alt="描述">上,且 fallback 图不能依赖<source></source>机制 -
placeholder.svg推荐内联 base64 或使用 data URL,彻底规避额外请求失败风险
CSS 背景图无法用 onerror,怎么办
background-image 是 CSS 层面的声明,没有 DOM 事件接口,onerror 对它完全无效。想实现类似降级,只能绕道:
- 改用
<img>标签 +object-fit模拟背景效果(最可靠) - 服务端生成带 fallback 的 CSS,例如通过构建工具注入备用 URL:
background-image: url("main.jpg"), url("fallback.jpg");(注意:CSS 多值 background 不是“失败回退”,而是叠加,不满足语义) - JavaScript 监听元素渲染后检查
getComputedStyle(el).backgroundImage是否含"none"或空值,再手动补救——但无法区分是加载失败还是初始未设置,实用性低
真正可控的降级,始终要落在 HTML 元素层级,而不是 CSS 声明上。
最容易被忽略的是:所有 fallback 资源本身也得经过可用性验证。本地开发时一切正常,上线后 CDN 缓存异常、路径大小写错误、权限配置遗漏,都会让降级链路在第二环就断裂。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










