Điều này thực sự phức tạp, đặc biệt nếu bạn định trả lại url hình ảnh cho các trường hợp sử dụng nơi bạn cần ghép các chuỗi với URL hình ảnh điều kiện onerror
, ví dụ: bạn có thể muốn lập trình tham số url
trong CSS.
Bí quyết là hình ảnh tải là không đồng bộ của thiên nhiên nên onerror
không xảy ra sunchronously, ví dụ: nếu bạn gọi returnPhotoURL
nó ngay lập tức trả undefined
BCS phương pháp không đồng bộ của tải/xử lý tải hình ảnh chỉ bắt đầu.
Vì vậy, bạn thực sự cần phải bọc kịch bản của bạn trong một Lời hứa sau đó gọi nó như dưới đây. LƯU Ý: tập lệnh mẫu của tôi thực hiện một số việc khác nhưng hiển thị khái niệm chung:
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;
}
});
}
Nguồn
2017-12-15 00:39:24
Điều này có thể thực sự nguy hiểm nếu 'http://placekitten.com/100/100' không tồn tại, vì trình duyệt sẽ búa 'http://placekitten.com/100/100' url liên tục. Xem http://stackoverflow.com/questions/92720/jquery-javascript-to-replace-broken-images cho giải pháp – Neromancer
@Neromancer Tôi đã thử nghiệm trong Chrome: http://jsfiddle.net/GvJh3/1/. Không có vòng lặp vô hạn nào xảy ra. –
@ ŠimeVidas: đó là vì Chrome chỉ đánh giá onerror một lần, trong khi tất cả các trình duyệt khác làm liên tục - để tránh vòng lặp, nó sẽ giống như sau: 'onerror =" this.onerror = null; this.src = 'http: // placekitten .com/100/100 '; "' –