You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

图片无法找到/加载失败时如何自动显示占位图的实现咨询

解决方案

共有两种常用实现方式,可根据你的业务场景选择:

方案1:HTML img标签自带onerror属性处理(推荐,改动量最小)

不需要修改你现有的路径判断逻辑,直接在渲染图片的标签上添加错误回调即可,当图片加载失败时会自动替换为占位图:

<!-- 记得替换下方占位图路径为你的实际路径,添加this.onerror=null避免占位图加载失败触发死循环 -->
<img src="{$img}" alt="图片描述" onerror="this.onerror=null; this.src='img/hosts/placeholder.png';">

如果页面内有大量图片需要统一处理,也可以全局绑定监听事件,不用逐个给img加属性:

document.addEventListener('error', function(e) {
  if (e.target.tagName.toLowerCase() === 'img') {
    e.target.src = 'img/hosts/placeholder.png';
    e.target.onerror = null;
  }
}, true);

方案2:JS预校验图片路径有效性

如果你需要在渲染页面之前就确定图片是否存在、提前处理路径,可以先写一个图片存在性校验函数,路径判断完成后先校验再输出最终路径:

// 图片路径有效性校验函数
function checkImgAvailable(url) {
  return new Promise((resolve) => {
    const tempImg = new Image();
    tempImg.onload = () => resolve(true);
    tempImg.onerror = () => resolve(false);
    tempImg.src = url;
  })
}

// 你原有路径判断逻辑
let $img = '';
if ($d == 1 && $h >= 1 && $h < 14) $img = 'img/hosts/monophy.png';
else if ($d == 1 && $h >= 14 && $h < 16) $img = 'img/hosts/mon24.jpg';
else if ($d == 1 && $h >= 16 && $h < 18) $img = 'img/hosts/mon46.jpg';
else if ($d == 1 && $h >= 18 && $h < 20) $img = 'img/hosts/mon68.jpg';
else if ($d == 1 && $h >= 20 && $h < 22) $img = 'img/hosts/mon810.jpg';
else if ($d == 1 && $h >= 22 && $h < 24) $img = 'img/hosts/MON1012.png';
else if ($d == 1 && $h >= 19) $img = 'img/hosts/monophy.png';
else if ($d == 2 && $h < 0) $img = 'img/hosts/monophy.png';

// 校验后生成最终图片路径
const PLACEHOLDER_IMG = 'img/hosts/placeholder.png';
const finalImg = await checkImgAvailable($img) ? $img : PLACEHOLDER_IMG;

两种方案对比

  • 方案1性能开销更低、代码改动量最小,适配后续新增的所有图片路径,适合绝大多数常规场景
  • 方案2适合需要提前感知图片加载结果、提前上报错误路径的特殊场景,会额外发起一次资源请求,性能开销略高

内容的提问来源于stack exchange,提问作者Niall O'Boyle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:06:04