Evento jQuery para imágenes cargadas

96

¿Es posible detectar cuándo se cargan todas las imágenes a través de un evento jQuery?

Idealmente, debería haber un

$(document).idle(function()
{
}

o

$(document).contentLoaded(function()
{
}

Pero no puedo encontrar tal cosa.

Pensé en adjuntar un evento como este:

$(document).ready(function()
{
    var imageTotal = $('img').length;
    var imageCount = 0;        
    $('img').load(function(){if(++imageCount == imageTotal) doStuff();});
}

Pero, ¿se romperá esto si una imagen no se carga? Es de vital importancia que se llame al método y en el momento adecuado.

Antony Carthy
fuente
9
¿Por qué no usas el evento onload: $ (window) .load (doStuff)? Sin embargo, Onload también esperará otros recursos (por ejemplo, scripts, hojas de estilo y flash) y no solo imágenes, que pueden o no estar bien para usted.
moff
Adjuntar un evento de carga a todas sus etiquetas img, como tiene en su ejemplo de código, debería ser funcional. Si una imagen no se carga, no se llamará a doStuff (), pero eso parece razonable dado el requisito de que se carguen todas las imágenes.
Steve Goodman
2
El método .load () ha quedado obsoleto desde jQuery 1.8. Mira esto: stackoverflow.com/questions/3877027/…
fiorix

Respuestas:

116

Según la documentación de jQuery , hay una serie de advertencias para usar el evento de carga con imágenes. Como se señaló en otra respuesta, el complemento ahpi.imgload.js está roto, pero la esencia de Paul Irish vinculada ya no se mantiene.

Según Paul Irish, el complemento canónico para detectar eventos de carga completa de imágenes ahora está en:

https://github.com/desandro/imagesloaded

Johnpolacek
fuente
4
Esta es la respuesta: maneja múltiples imágenes, imágenes almacenadas en caché, peculiaridades del navegador, imágenes rotas y es actual. Hermoso.
Yarin
7
lo probé hoy. estuvo en funcionamiento en 2 minutos.
CodeToad
De acuerdo con @Yarin, buena documentación, fácil de usar, múltiple, almacenada en caché, rota y actual. Quiéralo.
johntrepreneur
Sin embargo, en el lado negativo, imagesLoaded no es compatible con IE7 si eso es importante para usted.
johntrepreneur
1
Una solución rápida y sencilla de 2 líneas para que imagesLoaded funcione en IE7 .
johntrepreneur
63

Si desea verificar no todas las imágenes, sino una específica (por ejemplo, una imagen que reemplazó dinámicamente después de que DOM ya está completo), puede usar esto:

$('#myImage').attr('src', 'image.jpg').on("load", function() {  
  alert('Image Loaded');  
});  
rsc
fuente
70
Tenga cuidado, porque load()no se disparará cuando una imagen ya esté cargada. Esto puede suceder fácilmente cuando una imagen está en la caché del navegador del usuario. Puede verificar si una imagen ya está cargada usando $('#myImage').prop('complete'), que devuelve verdadero cuando se carga una imagen.
Blaise
6
¿Por qué tiene tantos votos cuando a) no responde a su pregunta yb) además da una mala solución? (Aunque la respuesta correcta es de @ johnpolacek y tiene 1 voto)
Yarin
5
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ADVERTENCIA!!!!!!!!!!!!!!! Ésta no es la respuesta correcta. johnpolacek tiene la respuesta correcta. Por favor vote su respuesta.
mrbinky3000
4
Estas objeciones ya no parecen ser relevantes excepto en una circunstancia muy específica: Webkit cuando cambia el src de una imagen al mismo src exacto que antes. Para las imágenes que acaba de agregar al DOM, $ (...). Load () debería ser suficiente. Probado en FF y Chrome actuales, e IE6-9: jsfiddle.net/b9chris/tXVCe/2
Chris Moschini
1
+1 Funciona bien cuando (usted sabe que) la imagen no está en la caché de los navegadores.
Lode
28

Puede usar mi complemento waitForImages para manejar esto ...

$(document).waitForImages(function() {
   // Loaded.
});

La ventaja de esto es que puede localizarlo en un elemento ancestro y, opcionalmente, puede detectar imágenes referenciadas en el CSS.

Sin embargo, esto es solo la punta del iceberg, consulte la documentación para obtener más funciones.

alex
fuente
Hola Alex, parece prometedor. Pero como lo mencionado en las respuestas y comentarios dados por johnpolacek e hirisov, ¿cubre el caso cuando la imagen ya está en la caché del navegador?
SexyBeast
Tengo un proceso que crea una imagen y la carga dinámicamente después de que la página ya se haya cargado, y necesitaba mostrar un cargador ajax mientras el usuario espera. Este complemento funciona perfectamente para ese caso de uso. ¡Sin embargo, debe llamar a la función después de configurar la propiedad img src!
John Livermore
20

No se garantiza el uso de jQuery $ (). Load () como un controlador de eventos IMG. Si la imagen se carga desde el caché, es posible que algunos navegadores no activen el evento. En el caso de las versiones (¿más antiguas?) De Safari, si cambió la propiedad SRC de un elemento IMG al mismo valor , el evento onload NO se activará.

Parece que esto se reconoce en el último jQuery (1.4.x) - http://api.jquery.com/load-event - para citar:

Es posible que el evento de carga no se active si la imagen se carga desde la caché del navegador. Para tener en cuenta esta posibilidad, podemos utilizar un evento de carga especial que se activa inmediatamente si la imagen está lista. event.special.load está disponible actualmente como complemento.

Ahora hay un complemento para reconocer este caso y la propiedad "completa" de IE para los estados de carga del elemento IMG: http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js

jschrab
fuente
16

Según esta respuesta , puede usar el evento de carga jQuery en el windowobjeto en lugar de document:

jQuery(window).load(function() {
    console.log("page finished loading now.");
});

Esto se activará después de que se haya cargado todo el contenido de la página. Esto difiere de lo jQuery(document).load(...)que se activa después de que DOM ha terminado de cargarse.

Tom
fuente
¡Esto es exactamente lo que estaba buscando!
Eric K
4

imagesLoaded Plugin es el camino a seguir, si necesita una solución de navegador cruzado

 $("<img>", {src: 'image.jpg'}).imagesLoaded( function( $images, $proper, $broken ){
 if($broken.length > 0){
 //Error CallBack
 console.log('Error');
 }
 else{
 // Load CallBack
 console.log('Load');
 }
 });

Si solo necesita un IE WorkAround, esto lo hará

 var img = $("<img>", {
    error: function() {console.log('error'); },
    load: function() {console.log('load');}
    });
  img.attr('src','image.jpg');
Jaideep Singh
fuente
2

Para imágenes del mismo origen, puede usar:

$.get('http://www.your_domain.com/image.jpg', imgLoaded);

function imgLoaded(){
    console.log(this, 'loaded');
}
vsync
fuente
0
  function CheckImageLoadingState()
  {
     var counter = 0;
     var length = 0;

     jQuery('#siteContent img').each(function() 
     {
        if(jQuery(this).attr('src').match(/(gif|png|jpg|jpeg)$/))
          length++;
     });

     jQuery('#siteContent img').each(function() 
     {  
        if(jQuery(this).attr('src').match(/(gif|png|jpg|jpeg)$/))
        {
           jQuery(this).load(function() 
           {
           }).each(function() {
              if(this.complete) jQuery(this).load();
            });
        }
        jQuery(this).load(function()
        {
           counter++;
           if(counter === length) 
           {  
              //function to call when all the images have been loaded
              DisplaySiteContent();
           }
        });
     });
  }
doofer
fuente
0
$( "img.photo" ).load(function() {

    $(".parrentDiv").css('height',$("img.photo").height());
    // very simple

}); 
Erfan Safarpoor
fuente
0

Creé mi propio script, porque encontré que muchos complementos estaban bastante inflados y solo quería que funcionara como quería. Mine comprueba si cada imagen tiene una altura (altura de imagen nativa). Lo he combinado con la función $ (window) .load () para solucionar los problemas del almacenamiento en caché.

Lo he comentado bastante en código, por lo que debería ser interesante de ver, incluso si no lo usa. Funciona perfectamente para mí.

Sin más preámbulos, aquí está:

Script imgLoad.js

3Dom
fuente
0

Esperando a que se carguen todas las imágenes ...
Encontré la respuesta a mi problema con jfriend00 aquí jquery: ¿cómo escuchar el evento cargado de imagen de un contenedor div? .. y "if (this.complete)" ¡
Esperando a que se cargue todo y posiblemente algo en la caché! .. y he agregado el evento "error" ... es robusto en todos los navegadores

$(function() { // Wait dom ready
    var $img = $('img'), // images collection
        totalImg = $img.length,
        waitImgDone = function() {
            totalImg--;
            if (!totalImg) {
                console.log($img.length+" image(s) chargée(s) !");
            }
        };
    $img.each(function() {
        if (this.complete) waitImgDone(); // already here..
        else $(this).load(waitImgDone).error(waitImgDone); // completed...
    });
});

Demostración: http://jsfiddle.net/molokoloco/NWjDb/

molokoloco
fuente