¿Cómo puedo activar un evento cuando todas las imágenes en el DOM están cargadas? He buscado mucho en Google. He encontrado esto, pero no parece funcionar:
Use el método load() (docs) contra la window .
$(window).load(function() { // this will fire after the entire page is loaded, including images }); Nota : en las versiones más recientes de jQuery, use $(window).on('load', function(){ ...});
O simplemente hágalo directamente a través de window.onload .
window.onload = function() { // this will fire after the entire page is loaded, including images }; Si desea que se active un evento separado para cada imagen, coloque un .load() en cada imagen.
$(function() { $('img').one('load',function() { // fire when image loads }); });O si existe la posibilidad de que una imagen se almacene en caché, haga esto:
$(function() { function imageLoaded() { // function to invoke for loaded image } $('img').each(function() { if( this.complete ) { imageLoaded.call( this ); } else { $(this).one('load', imageLoaded); } }); });EDITAR:
Para realizar alguna acción después de que se cargue la última imagen, use un contador establecido en el número total de imágenes y disminuya cada vez que se llame a un controlador de carga.
Cuando llegue a 0 , ejecute algún otro código.
$(function() { function imageLoaded() { // function to invoke for loaded image // decrement the counter counter--; if( counter === 0 ) { // counter is 0 which means the last // one loaded, so do something else } } var images = $('img'); var counter = images.length; // initialize the counter images.each(function() { if( this.complete ) { imageLoaded.call( this ); } else { $(this).one('load', imageLoaded); } }); });A continuación se muestra lo que se me ocurrió, usando objetos diferidos y $.when en lugar de usar un contador.
var deferreds = []; $('img').each(function() { if (!this.complete) { var deferred = $.Deferred(); $(this).one('load', deferred.resolve); deferreds.push(deferred); } }); $.when.apply($, deferreds).done(function() { /* things to do when all images loaded */ });Déjame saber si hay alguna advertencia.
Un problema que encontré con la solución editada del usuario 113716 es que una imagen rota evitará que el contador llegue a 0. Esto lo solucionó.
.error(function(){ imageLoaded(); $(this).hide(); });