图片加载失败时,可以替换成占位图。但 onerror 是事件处理代码,不是备用图片地址,写成 onerror=“2.jpg” 并不会自动切换来源。

普通 img 的一次性回退

对没有 srcset、picture 或框架绑定接管的普通图片,可以在开始加载前注册一次监听:

function setImageWithFallback(image, sourceUrl, fallbackUrl) {
  image.addEventListener('error', function () {
    image.src = fallbackUrl;
  }, { once: true });
  image.src = sourceUrl;
}

const image = document.createElement('img');
image.alt = '内容图片';
image.width = 320;
image.height = 180;
setImageWithFallback(image, '/example-image.png', '/example-fallback.png');
document.getElementById('image-container').appendChild(image);

页面需要存在 image-container,两个路径也应由项目提供。监听器只响应一次;备用图也失败时,不会再由这个监听器不断替换 src。

该函数按“一次新加载”使用,重复调用同一元素时需先清理旧监听器或由组件统一管理。真实组件还要处理 srcset 等选源规则。HTMLImageElement

AngularJS 写法是另一层封装

维护旧 AngularJS 项目时,可以用指令关联 ng-src 和备用路径,下面只是其事件边界示意:

app.directive('errSrc', function () {
  return {
    link: function (scope, element, attrs) {
      function onError() {
        element.off('error', onError);
        if (attrs.errSrc) attrs.$set('src', attrs.errSrc);
      }
      element.on('error', onError);
      scope.$on('$destroy', function () {
        element.off('error', onError);
      });
    }
  };
});

它只处理该指令绑定期间的首次失败;如果 ng-src 会反复更新,应另行设计重新注册和状态重置。AngularJS 指令不能直接放到现代 Angular 或 Ionic 的另一套模板中使用。

本地备用图也会失败

文件丢失、部署基础路径、资源格式或网络问题,都可能使占位图加载失败。工程内资源并不是永不失败的保证。

同时保留有意义的替代文本和稳定尺寸,测试原图成功、原图失败与备用图也失败。回退可以改善展示,但不应掩盖持续的资源错误或代替对失败原因的检查。