2009-11-01 3 views
11

J'ai une fonction jQuery ajax qui charge du contenu dans un div, une partie du contenu est une image. Je voudrais dire jusqu'à ce que les images qui viennent d'être chargées dans mon ajax, ont terminé le chargement, et ensuite exécuter une fonction, telle que montrer le contenu. De cette façon, je n'aurai pas le contenu chargé dans la div et les images commencent à se charger. Je veux qu'ils soient chargés, puis mettre le contenu, ou show() le contenu de la div.Savoir quand les images sont chargées dans la réponse AJAX

J'ai vu beaucoup de solutions à cela, comme en utilisant .load(), mais cela ne semble pas fonctionner pour le contenu qui a été chargé en utilisant ajax.

Répondre

12

Vous devez ajouter le gestionnaire de charge dans le rappel AJAX pour qu'il s'applique aux images qui sont chargées via l'appel AJAX. Vous pouvez également définir un minuteur pour afficher le contenu après un certain intervalle au cas où les images seraient chargées avant l'application du gestionnaire de chargement.

$.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 - J'aime beaucoup cette approche. – karim79

+0

J'ai du mal à faire fonctionner ça. Obtenir quelques erreurs js. Quelqu'un at-il un exemple de cela? –

+0

Ce script a fonctionné pour moi après que je l'ai modifié ... Voir mon poste Ci-dessous – bgreater

0

$("img").load() ne fonctionnera pas car les images sont chargées dynamiquement; cette commande ne s'appliquera qu'aux images de la page à ce moment-là.

utilisez $("img").live("load") pour suivre le chargement des images.

+0

Odd. J'allais dire que live ne supporte pas la charge - et ce n'est pas le cas - mais l'événement load n'apparaît pas dans les listes supportées ou non supportées. Avez-vous testé cela pour voir si cela fonctionne? – tvanfosson

+0

J'ai essayé: $ ('# productFull img') vivent ('charge', function() { alert ('image chargée!); \t \t });. Mais, cela n'a pas semblé fonctionner. Est-ce que cela doit être dans la portée de la fonction ajax? –

+0

Je ne l'ai pas testé, et s'il ne figure pas sur la liste supportée, il y a de fortes chances qu'il ne soit pas supporté car il serait difficile pour jQuery de l'implémenter. – mahemoff

10

Ceci est une version mise à jour du code tvanfosson fourni.

Vous devez vous assurer que la variable est imageCount compte une liste de noeuds et non une chaîne comme cela a été le problème dans le code original de je peux en déduire:

$.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

Je ne comprends pas pourquoi '++ imagesLoaded' fonctionnerait. '.load()' ne semble pas itérer, si c'est le cas, alors quand il y a plusieurs images, ne sera pas '$ ('# someDiv'). find ('img'). load' ne tirez qu'une fois pour la première image ? – shenkwen

+0

@shenkwen c'est b/c un événement load est ajouté à chacun des éléments renvoyés par le sélecteur jQuery. Si ce sont des images multiples, alors plusieurs fonctions de rappel seront exécutées et puisque la variable 'imagesLoaded' est définie en dehors du rappel, elle va itérer. – bgreater

Questions connexes