2009-11-01 5 views
11

Ho una funzione jQuery ajax che carica del contenuto in un div, parte del contenuto è immagine. Mi piacerebbe dire fino a quando quelle immagini che sono appena state caricate nella mia ajax, hanno finito di caricare e POI eseguire una funzione, come mostrare il contenuto. In questo modo, non avrò caricato il contenuto nel div e le immagini inizieranno a caricarsi. Voglio che vengano caricati, quindi inserire il contenuto o show() il contenuto nel div.Sapere quando le immagini hanno finito di caricare in risposta AJAX

Ho visto molte soluzioni a questo, come l'utilizzo di .load(), ma non sembra funzionare per il contenuto che è stato caricato utilizzando Ajax.

risposta

12

È necessario aggiungere il gestore di caricamento nel richiamo AJAX per farlo applicare alle immagini che vengono caricate tramite la chiamata AJAX. Si potrebbe anche voler impostare un timer per mostrare il contenuto dopo un certo intervallo nel caso in cui le immagini vengano caricate prima che venga applicato il gestore di carico.

$.ajax({ 
    ... 
    success: function(data) { 
      var imageCount = $(data).filter('img').length; 
      var imagesLoaded = 0; 
      $(data).hide() 
       .appendTo('#someDiv') 
       .filter('img') 
       .load(function() { 
        ++imagesLoaded; 
        if (imagesLoaded >= imageCount) { 
         $('#someDiv').children().show(); 
        } 
        }); 
      setTimeout(function() { $('#someDiv').children().show() }, 5000); 
     } 
}); 
+2

+1 - Mi piace molto questo approccio. – karim79

+0

Ho difficoltà a farlo funzionare. Ottenere alcuni errori js. Qualcuno ha un esempio di questo? –

+0

Questo script ha funzionato per me dopo averlo ottimizzato ... Vedere il mio post Sotto – bgreater

0

$("img").load() non funziona perché le immagini vengono caricate dinamicamente; quel comando si applicherà solo alle immagini sulla pagina al momento.

utilizzare $("img").live("load") per tracciare quando le immagini sono state caricate.

+0

dispari. Stavo per dire che live non supporta il caricamento, e potrebbe non esserlo, ma l'evento load non compare negli elenchi supportati o non supportati. Hai provato questo per vedere se funziona? – tvanfosson

+0

ho provato: $ ('# productFull img') vivono ('carico', function() { alert ('immagine caricata!'); \t \t });. Ma non sembrava funzionare. Questo deve essere all'interno della portata della funzione Ajax? –

+0

Non l'ho provato, e se non è presente nell'elenco supportato, ci sono buone probabilità che non sia supportato in quanto sarebbe difficile da implementare con jQuery. – mahemoff

10

Questa è una versione aggiornata del codice tvanfosson fornita.

è necessario assicurarsi che la variabile imageCount conta un elenco di nodi e non una stringa come era il problema nel codice originale da posso dedurre:

$.ajax({ 
    url  : 'somePage.html', 
    dataType : "html", 
    success : function(data) { 

     $(data).hide().appendTo('#someDiv'); 

     var imagesCount = $('#someDiv').find('img').length; 
     var imagesLoaded = 0; 

     $('#someDiv').find('img').load(function() { 
      ++imagesLoaded; 
      if (imagesLoaded >= imagesCount) { 
       $('#someDiv').children().show(); 
      } 
     }); 

     var timeout = setTimeout(function() { 
      $('#someDiv').children().show(); 
     }, 5000); 
    }      
}); 
+0

Non capisco perché '++ imagesLoaded' possa funzionare. '.load()' non sembra iterare, se è così, allora quando ci sono più immagini, non '$ ('# someDiv'). find ('img'). load' solo fire una volta per la prima immagine ? – shenkwen

+0

@shenkwen è b/c un evento di caricamento viene aggiunto a ciascuno degli elementi restituiti dal selettore jQuery. Se si tratta di immagini multiple, verranno eseguite più funzioni di richiamata e poiché la variabile 'imagesLoaded' è definita al di fuori del callback, itererà. – bgreater

Problemi correlati