To jest naprawdę trudne, zwłaszcza jeśli planujesz zwrócić adres URL obrazu dla przypadków użycia, w których musisz połączyć ciągi z adresem URL obrazu warunku onerror
, np. możesz chcieć programowo ustawić parametr url
w CSS.
Sztuką jest to, że obraz jest asynchroniczne ładowanie przez naturę tak onerror
nie zdarza sunchronously, to znaczy jeśli zadzwonisz returnPhotoURL
natychmiast powraca undefined
BCS asynchroniczny metody ładowania/przenoszenia obciążenia obrazu właśnie zaczęło.
Tak naprawdę, naprawdę powinieneś zawinąć swój skrypt w obietnicę, a następnie zadzwonić jak poniżej. UWAGA: mój przykładowy skrypt wykonuje kilka innych czynności, ale pokazuje ogólną koncepcję:
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;
}
});
}
Może to być naprawdę niebezpieczne, jeśli "http://placekitten.com/100/100" nie istnieje, ponieważ przeglądarka uderzy w URL "http://placekitten.com/100/100" ciągle. Zobacz http://stackoverflow.com/questions/92720/jquery-javascript-to-replace-broken-images for a solution – Neromancer
@Neromancer Testowałem w Chrome: http://jsfiddle.net/GvJh3/1/. Nie ma nieskończonej pętli. –
@ ŠimeVidas: To dlatego, że Chrome ocenia tylko onerror, podczas gdy wszystkie inne przeglądarki robią to ciągle - aby uniknąć pętli, powinno wyglądać tak: 'onerror =" this.onerror = null; this.src = 'http: // placekitten .com/100/100 '; "' –