Événement jQuery pour les images chargées

96

Est-il possible de détecter quand toutes les images sont chargées via un événement jQuery?

Idéalement, il devrait y avoir un

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

ou

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

Mais je ne trouve pas une telle chose.

J'ai pensé à joindre un événement comme celui-ci:

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

Mais cela se cassera-t-il si une image ne se charge pas? Il est extrêmement important que la méthode soit appelée, et au bon moment.

Antoine Carthy
la source
9
Pourquoi n'utilisez-vous pas l'événement onload: $ (window) .load (doStuff)? Onload, cependant, attendra également d'autres ressources (par exemple, des scripts, des feuilles de style et des fichiers flash) et pas seulement des images, qui peuvent ou non vous convenir.
moff
Attacher un événement de chargement à toutes vos balises img, comme vous l'avez fait dans votre exemple de code, devrait être fonctionnel. Si une image ne parvient pas à se charger, doStuff () ne sera pas appelé, mais cela semble raisonnable compte tenu de votre exigence que toutes les images doivent être chargées.
Steve Goodman
2
La méthode .load () est obsolète depuis jQuery 1.8. Vérifiez ceci: stackoverflow.com/questions/3877027/…
fiorix

Réponses:

116

Selon la documentation de jQuery , il existe un certain nombre de mises en garde pour l'utilisation de l'événement load avec des images. Comme indiqué dans une autre réponse, le plugin ahpi.imgload.js est cassé, mais l'essentiel Paul Irish lié n'est plus maintenu.

Pour Paul Irish, le plugin canonique pour détecter les événements de chargement d'image terminé est maintenant à:

https://github.com/desandro/imagesloaded

johnpolacek
la source
4
C'est la réponse: gère plusieurs images, images mises en cache, bizarreries de navigateur, images cassées et c'est courant. Belle.
Yarin
7
testé aujourd'hui. était opérationnel en 2 minutes.
CodeToad
D'accord avec @Yarin, bonne documentation, facile à utiliser, multiple, mis en cache, cassé et à jour. Aimer.
johntrepreneur
En revanche, imagesLoaded ne prend pas en charge IE7 si cela est important pour vous.
johntrepreneur
1
Une solution rapide et simple en 2 lignes pour que les imagesLoaded fonctionnent sur IE7 .
johntrepreneur
63

Si vous ne voulez pas vérifier toutes les images, mais une image spécifique (par exemple, une image que vous avez remplacée dynamiquement une fois le DOM terminé), vous pouvez utiliser ceci:

$('#myImage').attr('src', 'image.jpg').on("load", function() {  
  alert('Image Loaded');  
});  
rsc
la source
70
Attention, car load()ne se déclenchera pas lorsqu'une image est déjà chargée. Cela peut se produire facilement lorsqu'une image se trouve dans le cache du navigateur de l'utilisateur. Vous pouvez vérifier si une image est déjà chargée en utilisant $('#myImage').prop('complete'), qui renvoie true lorsqu'une image est chargée.
Blaise
6
Pourquoi cela a-t-il autant de votes alors que a) ne répond pas à sa question et b) donne une mauvaise solution en plus? (Meanshile, la bonne réponse est @ johnpolacek et a 1 vote)
Yarin
5
AVERTISSEMENT!!!!!!!!!!!!!!! Ce n'est pas la bonne réponse. johnpolacek a la bonne réponse. Veuillez voter sa réponse.
mrbinky3000
4
Ces objections ne semblent plus pertinentes sauf dans une circonstance très spécifique: Webkit lorsque vous changez le src d'une image en exactement le même src qu'auparavant. Pour les images que vous venez d'ajouter au DOM, $ (...). Load () devrait suffire. Testé dans FF et Chrome actuels, et IE6-9: jsfiddle.net/b9chris/tXVCe/2
Chris Moschini
1
+1 Fonctionne correctement lorsque (vous savez que) l'image n'est pas dans le cache du navigateur.
Lode
28

Vous pouvez utiliser mon plugin waitForImages pour gérer cela ...

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

L'avantage de ceci est que vous pouvez le localiser sur un élément ancêtre et il peut éventuellement détecter les images référencées dans le CSS.

Ce n'est cependant que la pointe de l'iceberg, consultez la documentation pour plus de fonctionnalités.

Alex
la source
Salut Alex, ça a l'air prometteur. Mais comme mentionné dans les réponses et commentaires de johnpolacek et hirisov, couvre-t-il le cas lorsque l'image est déjà dans le cache du navigateur?
SexyBeast
J'ai un processus qui crée une image et la charge dynamiquement après que la page a déjà été chargée, et j'avais besoin de montrer un chargeur ajax pendant que l'utilisateur attend. Ce plugin fonctionne parfaitement pour ce cas d'utilisation. Vous devez cependant appeler la fonction après avoir défini la propriété img src!
John Livermore
20

L'utilisation de jQuery $ (). Load () comme gestionnaire d'événements IMG n'est pas garantie. Si l'image se charge à partir du cache, certains navigateurs peuvent ne pas déclencher l'événement. Dans le cas des versions (plus anciennes?) De Safari, si vous avez modifié la propriété SRC d'un élément IMG sur la même valeur , l'événement onload ne se déclenchera PAS.

Il semble que cela soit reconnu dans la dernière jQuery (1.4.x) - http://api.jquery.com/load-event - pour citer:

Il est possible que l'événement de chargement ne soit pas déclenché si l'image est chargée à partir du cache du navigateur. Pour tenir compte de cette possibilité, nous pouvons utiliser un événement de chargement spécial qui se déclenche immédiatement si l'image est prête. event.special.load est actuellement disponible en tant que plugin.

Il existe maintenant un plug-in pour reconnaître ce cas et la propriété "complete" d'IE pour les états de chargement des éléments IMG: http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js

jschrab
la source
16

Selon cette réponse , vous pouvez utiliser l' événement de chargement jQuery sur l' windowobjet au lieu de document:

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

Cela sera déclenché une fois que tout le contenu de la page aura été chargé. Cela diffère de celui jQuery(document).load(...)qui est déclenché une fois le chargement du DOM terminé.

À M
la source
Ceci est exactement ce que je cherchais!
Eric K
4

imagesLoaded Plugin est la voie à suivre, si vous avez besoin d'une solution crossbrowser

 $("<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 vous avez juste besoin d'un WorkAround IE, cela fera l'affaire

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

Pour les images de même origine, vous pouvez utiliser:

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

function imgLoaded(){
    console.log(this, 'loaded');
}
vsync
la source
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
la source
0
$( "img.photo" ).load(function() {

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

}); 
Erfan Safarpoor
la source
0

J'ai créé mon propre script, car je trouvais que de nombreux plugins étaient assez gonflés et je voulais juste qu'il fonctionne comme je le voulais. Le mien vérifie si chaque image a une hauteur (hauteur de l'image native). J'ai combiné cela avec la fonction $ (window) .load () pour contourner les problèmes de mise en cache.

Je l'ai beaucoup commenté dans le code, donc cela devrait être intéressant à regarder, même si vous ne l'utilisez pas. Cela fonctionne parfaitement pour moi.

Sans plus tarder, voilà:

Script imgLoad.js

3Dom
la source
0

En attendant que toutes les images se chargent ...
J'ai trouvé la réponse à mon problème avec jfriend00 ici jquery: comment écouter l'événement chargé d'image d'un div conteneur? .. et "if (this.complete)"
En attendant que tout se charge et éventuellement en cache! .. et j'ai ajouté l'événement "error" ... c'est robuste sur tous les navigateurs

$(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...
    });
});

Démo: http://jsfiddle.net/molokoloco/NWjDb/

molokoloco
la source