Как использовать атрибут onerror элемента img - PullRequest
32 голосов
/ 14 ноября 2011

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.

Ответы [ 3 ]

97 голосов
/ 14 ноября 2011

Это работает:

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

Живая демоверсия: http://jsfiddle.net/oLqfxjoz/

Как указал Никола в комментарии ниже, в случае, если резервный URL-адрес также недействителен, некоторые браузеры снова будут вызывать событие «error», что приведет к бесконечному циклу. Мы можем защититься от этого, просто обнулив обработчик «error» через this.onerror=null;.

1 голос
/ 15 декабря 2017

Это на самом деле сложно, особенно если вы планируете возвращать URL-адрес изображения для случаев использования, когда вам нужно объединить строки с URL-адресом изображения условия onerror, например, вы можете программно установить параметр url в CSS.

Хитрость заключается в том, что загрузка изображения по своей природе асинхронная, поэтому onerror не происходит синхронно, т. Е. Если вы вызываете returnPhotoURL, он немедленно возвращает undefined bcs асинхронный метод загрузки / обработки изображениязагрузка только началась.

Итак, вам действительно нужно обернуть ваш скрипт в 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;
        }
    });
}
0 голосов
/ 26 марта 2018

очень просто

  <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
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...