Il plugin che @alex ha scritto non ha funzionato per me per qualche motivo ... Non riuscivo a capire perché. Ma il suo codice mi ha ispirato a trovare una soluzione più leggera che funzioni per me. Usa le promesse di jquery. Si noti che a differenza del plugin @alex, questo non tenta di tenere conto delle immagini di sfondo sugli elementi, solo degli elementi 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);
}
Quindi è possibile utilizzare qualcosa di simile:
$.ajax({
cache: false,
url: 'ajax/content.php',
success: function(data) {
$('#divajax').html(data).imagesLoaded().then(function(){
// do stuff after images are loaded here
});
}
});
Speriamo che questo è utile per qualcuno.
Si noti che utilizzando il codice precedente, se uno degli errori delle immagini (ad esempio perché l'URL era sbagliato), la promessa viene comunque risolta e l'errore viene ignorato. Questo potrebbe essere ciò che desideri, ma, a seconda della situazione, potresti decidere di interrompere qualsiasi cosa tu stia facendo se un'immagine non viene caricata.Nel qual caso si potrebbe sostituire la linea onerror come segue:
img.onerror = function(){dfd.reject();}
E catturare l'errore come questo:
$('#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
});
fonte
2013-08-01 08:53:40
Questo funziona benissimo! Grazie. –
Questo funziona meravigliosamente. Grazie. – J82
sembra che potrebbe creare una perdita di memoria. ogni volta che effettui una chiamata Ajax, crei un duplicato di ogni immagine sulla pagina in memoria e allega un evento a ciascun nuovo oggetto immagine, mantenendo l'oggetto immagine in memoria dopo che la funzione imagesLoaded è stata completata. Una volta caricati tutti gli oggetti immagine duplicati, quando vengono rimossi dalla memoria? Subito dopo l'esecuzione del callback dell'evento onload? –