El plugin que @alex escribió no funcionó para mí por alguna razón ... No pude entender por qué. Pero su código me inspiró a encontrar una solución más liviana que esté funcionando para mí. Utiliza las promesas jquery. Tenga en cuenta que, a diferencia del complemento de @alex, esto no intenta contabilizar las imágenes de fondo en los elementos, solo elementos 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);
}
A continuación, se puede usar algo como esto:
$.ajax({
cache: false,
url: 'ajax/content.php',
success: function(data) {
$('#divajax').html(data).imagesLoaded().then(function(){
// do stuff after images are loaded here
});
}
});
Con suerte eso es útil para alguien.
Tenga en cuenta que si utiliza el código anterior, si uno de los errores de imagen (por ejemplo, porque la URL era incorrecta), la promesa se resuelve de todos modos y el error se ignora. Esto podría ser lo que quiera, pero, dependiendo de su situación, podría querer abortar lo que esté haciendo si una imagen no se carga.En cuyo caso podría reemplazar la línea onerror de la siguiente manera:
img.onerror = function(){dfd.reject();}
y coger el error como este:
$('#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
});
¡Esto funciona genial! Gracias. –
Esto funciona maravillosamente. Gracias. – J82
esto parece que puede crear una pérdida de memoria. Cada vez que realiza una llamada ajax, crea un duplicado de cada imagen en la página en memoria y adjunta un evento a cada nuevo objeto de imagen, manteniendo el objeto de imagen en la memoria después de que la función imagesLoaded termine de ejecutarse. Una vez que se cargan todos los objetos de imagen duplicados, ¿cuándo se eliminan de la memoria? ¿Inmediatamente después de ejecutar la devolución de llamada del evento onload? –