/** * 全局图片加载失败占位: * 在捕获阶段监听 的 error 事件(error 不冒泡),失败时替换为内联 SVG 占位图。 * - 每张图片只替换一次,占位图自身加载失败不会再次触发,避免死循环 * - 空 src 不处理 * - 需要自行处理 error 的图片可添加 data-no-fallback 属性跳过 */ const PLACEHOLDER = "data:image/svg+xml;utf8," + encodeURIComponent( "" + "" + "" + "" + "" ); export function setupImgFallback() { document.addEventListener( "error", (event) => { const el = event.target; if (!el || el.tagName !== "IMG") return; if (el.dataset.noFallback !== undefined || el.dataset.fallbackApplied) return; if (!el.getAttribute("src")) return; el.dataset.fallbackApplied = "1"; el.src = PLACEHOLDER; }, true ); }