如何使用img元素的onerror属性

72
CSS:
.posting-logo-div {
}
.posting-logo-img {
  height: 120px;
  width: 120px;
}
.posting-photo-div {
  height: 5px;
  width: 5px;
  position: relative;
  top: -140px;
  left: 648px;
}
.posting-photo-img {
  height: 240px;
  width: 240px;
}

HTML:

<div id="image" class="posting-logo-div">
  <img
    src="../images/some-logo1.jpg"
    onerror="this.src='../images/no-logo-120.jpg';"
    class="posting-logo-img"
  />
</div>
<div id="photo" class="posting-photo-div">
  <img
    src="../images/some-logo2.jpg"
    onerror="this.src='../images/no-logo-240.jpg';"
    class="posting-photo-img"
  />
</div>

这似乎在Chrome或Mozilla中无法运行,但在IE中可以。
5个回答

203
这有效:
<img src="invalid_link"
     onerror="this.onerror=null;this.src='https://placeimg.com/200/300/animals';"
>

现场演示:http://jsfiddle.net/oLqfxjoz/

正如Nikola在下面的评论中指出的那样,在备用URL无效的情况下,某些浏览器将再次触发“error”事件,这将导致无限循环。我们可以通过简单地将“error”处理程序置为空来避免这种情况:this.onerror=null;


10
这是因为Chrome只会评估一次onerror,而其他所有浏览器都会持续评估-onerror,为了避免循环,它应该像这样: onerror="this.onerror=null; this.src='http://placekitten.com/100/100';" - Nikola Bogdanović
有没有一种方法可以在惰性加载时执行错误处理?我的src是loader.gif。但是我的原始图像加载在data-original属性中,这不会触发onerror函数。 - harishannam
@harishannam 我假设你的懒加载脚本从data-original属性中获取URL,并将其设置为图像的src,是吗? - Šime Vidas
1
@harishannam 一个data-original属性不会触发这些URL的加载。你是否使用了一个库?如果是,那个库应该提供一个错误处理程序。 - Šime Vidas
显示剩余5条评论

3

这其实有些棘手,特别是当你计划返回一个图片URL用于需要将字符串与 onerror 条件的图片URL 连接起来的情况时。例如,你可能希望在CSS中编程设置 url 参数。

诀窍在于,图像加载天生是异步的,因此 onerror 不会同步发生,即如果你调用 returnPhotoURL,它会立即返回 undefined,因为处理图像加载的异步方法刚刚开始。

因此,你真正需要做的是将脚本包装在一个Promise中,然后像下面这样调用它。注意:我的示例脚本做了一些其他事情,但显示了一般概念:

returnPhotoURL().then(function(value){
    doc.getElementById("account-section-image").style.backgroundImage = "url('" + value + "')";
}); 


function returnPhotoURL(){
    return new Promise(function(resolve, reject){
        var img = new Image();
        //if the user does not have a photoURL let's try and get one from gravatar
        if (!firebase.auth().currentUser.photoURL) {
            //first we have to see if user han an email
            if(firebase.auth().currentUser.email){
                //set sign-in-button background image to gravatar url
                img.addEventListener('load', function() {
                    resolve (getGravatar(firebase.auth().currentUser.email, 48));
                }, false);
                img.addEventListener('error', function() {
                    resolve ('//rack.pub/media/fallbackImage.png');
                }, false);            
                img.src = getGravatar(firebase.auth().currentUser.email, 48);
            } else {
                resolve ('//rack.pub/media/fallbackImage.png');
            }
        } else {
            img.addEventListener('load', function() {
                resolve (firebase.auth().currentUser.photoURL);
            }, false);
            img.addEventListener('error', function() {
                resolve ('https://rack.pub/media/fallbackImage.png');
            }, false);      
            img.src = firebase.auth().currentUser.photoURL;
        }
    });
}

2

非常简单

  <img onload="loaded(this, 'success')" onerror="error(this, 
 'error')"  src="someurl"  alt="" />

 function loaded(_this, status){
   console.log(_this, status)
  // do your work in load
 }
 function error(_this, status){
  console.log(_this, status)
  // do your work in error
  }

1

在ReactJS中:

const Avatar = ({className, src, alt, ...props}) => {
const handleOnError = (e) => {
    e.target.src =
      "https://www.kindpng.com/picc/m/22-223863_no-avatar-png-circle-transparent-png.png";
}
return (
  <div>
    {src ? (
      <img
        {...props}
        className={`defaultClass ${className}`}
        src={src}
        alt={alt}
        onError={handleOnError}
      />
    ) : (
      <img
        {...props}
        className={`defaultClass ${className}`}
        src={
          "https://www.kindpng.com/picc/m/22-223863_no-avatar-png-circle-transparent-png.png"
        }
        alt={alt}
      />
    )}
  </div>
);}

在上面的代码中,每当检测到无效的src链接时,handleOnError函数就会被触发,因此我们可以在该函数中分配默认链接。
如果您想查看react中onError属性的实现,可以查看这个视频:

如何创建完美的Avatar组件


1
将product.invoice_url替换为您的动态URL。
<img onerror="this.onerror=null;this.src='https://upload.wikimedia.org/wikipedia/commons/1/14/No_Image_Available.jpg';" [src]="product.invoice_url" class="img-thump" >

css

  .img-thump{
    height: 120px;
    width: 170px;
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接