Esto es realmente complicado, especialmente si planea devolver una url de imagen para casos de uso en los que necesite concatenar cadenas con la URL de la imagen de condición onerror
, p. es posible que desee establecer programáticamente el parámetro url
en CSS.
El truco es que la carga de imágenes es asíncrona, por naturaleza, por lo que el onerror
no sucede sunchronously, es decir, si se llama a returnPhotoURL
, vuelve inmediatamente undefined
BCS el método asíncrono de carga/el manejo de la carga de la imagen acaba de comenzar.
Por lo tanto, realmente debe ajustar su secuencia de comandos en una Promesa y luego llamarla como a continuación. Nota: Mi script de ejemplo hace algunas otras cosas, pero muestra el concepto general:
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;
}
});
}
Esto puede ser muy peligroso si 'http://placekitten.com/100/100' no existe, ya que el navegador fijará el 'http://placekitten.com/100/100' url continuamente. Consulte http://stackoverflow.com/questions/92720/jquery-javascript-to-replace-broken-images para obtener una solución – Neromancer
@Neromancer He probado en Chrome: http://jsfiddle.net/GvJh3/1/. No se produce ningún bucle infinito. –
@ ŠimeVidas: eso es porque Chrome evalúa onerror solo una vez, mientras que todos los demás navegadores lo hacen de forma continua: para evitar el bucle, debe verse así: 'onerror =" this.onerror = null; this.src = 'http: // placekitten .com/100/100 '; "' –