onerror无限循环的直接原因是备用图路径也404,导致“换图→失败→再换图”死链;必须写成this.src='...'; this.onerror=null;且顺序不能颠倒、分号不可省。

onerror无限循环的直接原因是什么
根本不是代码写错了,而是备用图路径也 404 —— 浏览器加载 fallback.png 失败后,再次触发 onerror,形成「换图 → 失败 → 再换图 → 再失败」的死链。内存会持续上涨,严重时标签页无响应或崩溃。
必须写的两行代码:顺序不能错
this.onerror=null 必须和 this.src=... 写在同一句内,且 this.onerror=null 要在赋值之后立即执行(顺序颠倒就失效):
@@##@@
- 分号不能省,否则 JS 解析失败
- 绝对路径优先,避免相对路径解析出错(比如
./img/在子路由下变成/user/./img/) - 推荐用内联 SVG:
data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAiIGhlaWdodD0iMzAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==,彻底规避路径风险
动态插入的
为什么 onerror 不生效
因为事件绑定太晚:元素已插入 DOM,错误在 appendChild() 时就发生了,onerror 属性还没来得及挂上,事件直接丢失。
实现 Markdown↔ HTML 互转,支持导出 PDF,用于用户请求的文档格式转换。
- 必须在插入前绑定:
img.onerror = () => { img.src = '/placeholder.svg'; img.onerror = null; }; - 或者统一用
document.addEventListener('error', ...)捕获,但需过滤非img元素和已标记的节点(用dataset.loaded) - 不要依赖模板引擎自动注入
onerror字符串——它可能被转义、截断或延迟执行
alt 和 onerror 各管什么,能互相替代吗
不能。它们职责完全不同:
-
alt是无障碍基础 + 纯文本兜底,图片加载失败且onerror未触发(比如空src、CORS 阻塞、服务器返回 200 的兜底页)时唯一可见内容 -
onerror只响应「真实网络请求失败」(HTTP 状态码非 2xx/3xx),不处理空src、协议非法、file://路径等场景 - 只写
alt会留白;只写onerror会卡死;两者必须共存,且语义独立
真正容易被忽略的是:服务端渲染首屏时,src 必须是真实可访问的 URL,不能靠 JS 后续补全——否则断网或 JS 失效时,连 alt 都没机会展示。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










