Evento jQuery per le immagini caricate


96

È possibile rilevare quando tutte le immagini vengono caricate tramite un evento jQuery?

Idealmente, dovrebbe esserci un file

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

o

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

Ma non riesco a trovare una cosa del genere.

Ho pensato di allegare un evento come questo:

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

Ma si interromperà se un'immagine non viene caricata? È di fondamentale importanza che il metodo venga chiamato e al momento giusto.


9
Perché non usi l'evento onload: $ (window) .load (doStuff)? Onload, tuttavia, attenderà anche altre risorse (ad es. Script, fogli di stile e flash) e non solo immagini, che potrebbero o meno essere OK per te.
moff

Il collegamento di un evento di caricamento a tutti i tag img, come nell'esempio di codice, dovrebbe essere funzionale. Se un'immagine non riesce a caricarsi, doStuff () non verrà chiamato, ma sembra ragionevole dato il tuo requisito che tutte le immagini devono essere caricate.
Steve Goodman,

2
Il metodo .load () è stato deprecato da jQuery 1.8. Check this out: stackoverflow.com/questions/3877027/...
fiorix

Risposte:


116

Secondo la documentazione di jQuery , ci sono una serie di avvertenze per l'utilizzo dell'evento load con le immagini. Come notato in un'altra risposta, il plugin ahpi.imgload.js è rotto, ma l'essenza Paul Irish collegata non viene più mantenuta.

Secondo Paul Irish, il plug-in canonico per il rilevamento degli eventi di completamento del caricamento delle immagini è ora all'indirizzo:

https://github.com/desandro/imagesloaded


4
Questa è la risposta: gestisce più immagini, immagini memorizzate nella cache, stranezze del browser, immagini interrotte ed è aggiornato. Bellissimo.
Yarin

7
testato oggi. è stato installato e funzionante in 2 minuti.
CodeToad

D'accordo con @Yarin, buona documentazione, facile da usare, multipla, memorizzata nella cache, non funzionante e attuale. Lo adoro.
johntrepreneur

Sul lato negativo, tuttavia, imagesLoaded non supporta IE7 se questo è importante per te.
johntrepreneur

1
Una soluzione rapida e semplice su 2 righe per far funzionare le immagini caricate su IE7 .
johntrepreneur

63

Se vuoi controllare non tutte le immagini, ma una specifica (es. Un'immagine che hai sostituito dinamicamente dopo che DOM è già completo) puoi usare questo:

$('#myImage').attr('src', 'image.jpg').on("load", function() {  
  alert('Image Loaded');  
});  

70
Fai attenzione, perché load()non si attiverà quando un'immagine è già caricata. Ciò può accadere facilmente quando un'immagine è nella cache del browser dell'utente. È possibile verificare se un'immagine è già caricata utilizzando $('#myImage').prop('complete'), che restituisce true quando viene caricata un'immagine.
Blaise

6
Perché questo ha così tanti voti quando a) non risponde alla sua domanda eb) fornisce inoltre una soluzione scadente? (Nel frattempo la risposta corretta è di @ johnpolacek e ha 1 voto)
Yarin

5
AVVERTIMENTO!!!!!!!!!!!!!!! Questa non è la risposta corretta. johnpolacek ha la risposta corretta. Si prega di votare la sua risposta.
mrbinky3000

4
Queste obiezioni non sembrano più rilevanti se non in una circostanza molto specifica: Webkit quando cambi il src di un'immagine nello stesso identico src di prima. Per le immagini che hai appena aggiunto al DOM, $ (...). Load () dovrebbe essere sufficiente. Testato con FF e Chrome attuali e IE6-9: jsfiddle.net/b9chris/tXVCe/2
Chris Moschini

1
+1 Funziona bene quando (lo sai) l'immagine non è nella cache del browser.
Lode

28

Puoi usare il mio plugin waitForImages per gestire questo ...

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

Il vantaggio di ciò è che puoi localizzarlo in un elemento antenato e può facoltativamente rilevare le immagini a cui fa riferimento il CSS.

Questa è solo la punta dell'iceberg, controlla la documentazione per ulteriori funzionalità.


Ciao Alex, sembra promettente. Ma come menzionato nelle risposte e nei commenti forniti da johnpolacek e hirisov, copre il caso in cui l'immagine è già nella cache del browser?
SexyBeast

Ho un processo che crea un'immagine e la carica dinamicamente dopo che la pagina è già stata caricata, e avevo bisogno di mostrare un caricatore ajax mentre l'utente aspetta. Questo plugin funziona perfettamente per quel caso d'uso. Tuttavia, devi chiamare la funzione dopo aver impostato la proprietà img src!
John Livermore

20

L'uso di jQuery $ (). Load () come gestore di eventi IMG non è garantito. Se l'immagine viene caricata dalla cache, alcuni browser potrebbero non attivare l'evento. Nel caso di versioni (precedenti?) Di Safari, se hai modificato la proprietà SRC di un elemento IMG con lo stesso valore , l'evento onload NON si attiverà.

Sembra che questo sia riconosciuto nell'ultimo jQuery (1.4.x) - http://api.jquery.com/load-event - per citare:

È possibile che l'evento di caricamento non venga attivato se l'immagine viene caricata dalla cache del browser. Per tenere conto di questa possibilità, possiamo utilizzare uno speciale evento di caricamento che si attiva immediatamente se l'immagine è pronta. event.special.load è attualmente disponibile come plugin.

Ora c'è un plug-in per riconoscere questo caso e la proprietà "complete" di IE per il caricamento dell'elemento IMG: http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js


16

Secondo questa risposta , è possibile utilizzare l' evento carico jQuery sul windowoggetto invece del document:

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

Questo verrà attivato dopo che tutto il contenuto della pagina è stato caricato. Questo è diverso da quello jQuery(document).load(...)che viene attivato al termine del caricamento del DOM.


Questo e 'esattamente quello che stavo cercando!
Eric K

4

imagesLoaded Plugin è la strada da percorrere, se hai bisogno di una soluzione 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');
 }
 });

Se hai solo bisogno di un IE WorkAround, questo andrà bene

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


2

Per le immagini della stessa origine, puoi usare:

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

function imgLoaded(){
    console.log(this, 'loaded');
}


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

0
$( "img.photo" ).load(function() {

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

}); 

0

Ho creato il mio script, perché ho trovato molti plugin piuttosto gonfiati e volevo solo che funzionasse come volevo. Il mio controlla se ogni immagine ha un'altezza (altezza dell'immagine nativa). L'ho combinato con la funzione $ (window) .load () per aggirare i problemi di memorizzazione nella cache.

L'ho commentato in codice abbastanza pesantemente, quindi dovrebbe essere interessante da guardare, anche se non lo usi. Funziona perfettamente per me.

Senza ulteriori indugi, eccolo:

script imgLoad.js


0

In attesa del caricamento di tutte le immagini ...
Ho trovato la risposta al mio problema con jfriend00 qui jquery: come ascoltare l'evento caricato di immagine di un div contenitore? .. e "if (this.complete)"
Aspettando che tutto venga caricato e un po 'eventualmente nella cache! .. e ho aggiunto l'evento "error" ... è robusto su tutti i browser

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

Demo: http://jsfiddle.net/molokoloco/NWjDb/


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.