Wtyczka, którą napisał @alex, nie zadziałała dla mnie z jakiegoś powodu ... Nie mogłem zrozumieć dlaczego. Ale jego kod zainspirował mnie do opracowania bardziej lekkiego rozwiązania, które dla mnie działa. Używa jquery obietnic. Zauważ, że w przeciwieństwie do wtyczki @alex, to nie próbuje uwzględniać obrazów tła na elementach, tylko elementy img.
// Fn to allow an event to fire after all images are loaded
$.fn.imagesLoaded = function() {
// get all the images (excluding those with no src attribute)
var $imgs = this.find('img[src!=""]');
// if there's no images, just return an already resolved promise
if (!$imgs.length) {return $.Deferred().resolve().promise();}
// for each image, add a deferred object to the array which resolves when the image is loaded (or if loading fails)
var dfds = [];
$imgs.each(function(){
var dfd = $.Deferred();
dfds.push(dfd);
var img = new Image();
img.onload = function(){dfd.resolve();}
img.onerror = function(){dfd.resolve();}
img.src = this.src;
});
// return a master promise object which will resolve when all the deferred objects have resolved
// IE - when all the images are loaded
return $.when.apply($,dfds);
}
Wtedy można go używać coś takiego:
$.ajax({
cache: false,
url: 'ajax/content.php',
success: function(data) {
$('#divajax').html(data).imagesLoaded().then(function(){
// do stuff after images are loaded here
});
}
});
Mam nadzieję, że pomocne dla kogoś.
Należy zauważyć, że używając powyższego kodu, jeśli jeden z błędów obrazu (np. Z powodu nieprawidłowego adresu URL), obietnica zostanie rozwiązana, a błąd zostanie zignorowany. Może to być tym, czego potrzebujesz, ale w zależności od sytuacji możesz zamiast tego chcieć przerwać cokolwiek robisz, jeśli obraz się nie załaduje.W takim przypadku można zastąpić onError linię następująco:
img.onerror = function(){dfd.reject();}
i złapać błąd podobny do tego:
$('#divajax').html(data).imagesLoaded().done(function(){
// do stuff after all images are loaded successfully here
}).fail(function(){
// do stuff if any one of the images fails to load
});
To działa świetnie! Dzięki. –
To działa cudownie. Dziękuję Ci. – J82
wygląda na to, że może to spowodować przeciek pamięci. za każdym razem, gdy wywołujesz wywołanie ajax, tworzysz duplikat każdego obrazu na stronie w pamięci i dołączasz zdarzenie do każdego nowego obiektu obrazu, zachowując obiekt obrazu w pamięci po wykonaniu funkcji imagesLoaded. Po załadowaniu wszystkich zduplikowanych obiektów obrazu, kiedy są one usuwane z pamięci? Bezpośrednio po uruchomieniu wywołania zwrotnego zdarzenia onload? –