2010-12-07 8 views
1

J'essaye de charger du contenu ajax puis de remplacer le contenu existant sur la page par le contenu nouvellement téléchargé. Le problème est que j'ai besoin de lier load(handler(eventObject)) événement pour les données remplacées. J'ai besoin de cela pour déclencher quand toutes les images sont chargées. Voici ce que j'ai jusqu'à présent:jQuery load-event after replaceAvec

$("#mainContentHolder").live("load", function(){ 
    alert("images loaded!") 
}); 

$.get("content.htm", function(data){ 
    $("#mainContentHolder").replaceWith(data); 
    alert("content is loaded!"); 
}); 

Je vois une alerte lorsque le contenu est chargé, mais il arrive avant que les images sont chargées et alerte sur les images de charge ne se reproduise jamais (j'ai aussi essayé bind() au lieu de live() avant). Est-ce que quelqu'un sait une solution pour cela?

+1

Ce contenu, voulez-vous dire seulement des images, ou existe-t-il d'autres types de ressources supplémentaires? – Orbling

+0

@negative lire cette astuce aussi http://web.enavu.com/daily-tip/daily-tip-difference-between-document-ready-and-window-load-in-jquery/ – kobe

+0

@Orbling, oui c'est plus que des images, mais je suppose que je les obtiens tous à la publication '.get()'. –

Répondre

2

Cela peut ou peut ne pas être votre problème, mais il semble que le conteneur que vous avez attaché votre fonction de charge d'image est remplacée lorsque vous chargez le contenu ajax:

$("#mainContentHolder").live("load", function(){ //you are attaching to current and future '#mainContentHolder' elements 
    alert("images loaded!") 
}); 

$.get("content.htm", function(data){ 
    $("#mainContentHolder").replaceWith(data); //'#mainContentHolder' element is replaced with something else 
    alert("content is loaded!"); 
}); 

Je ne sais pas ce que le contenu est à venir à partir de votre appel AJAX, mais s'il n'a pas d'élément #mainContentHolder, votre gestionnaire d'événements de chargement d'image n'aura rien à ajouter.

Si c'est pas, il y a aussi ce bit: (de http://api.jquery.com/load-event/)

Il est possible que l'événement de charge ne sera pas déclenchée 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. La charge event.special est currently available as a plugin.

Espérons que l'un d'entre eux vous aidera.

+0

En ce qui concerne les objets mis en cache, il est plus facile de vérifier simplement '.complete' sur l'objet lors de la liaison de l'événement load. – Orbling

+0

wow, si stupide de ma part, merci, vous avez raison. Pour une raison quelconque, j'ai supposé que 'replaceWidth' remplacerait le contenu du conteneur. Je vais essayer –

+1

Si vous voulez juste remplacer le contenu, au lieu de remplacer l'élément entier, vous pouvez utiliser '.html()' au lieu de '.replaceWith()'. Voir la documentation ici: http://api.jquery.com/html/ – Ender

0

Est-il possible de mettre le $ .get dans la fonction de chargement en direct?

$("#mainContentHolder").live("load", function(){ 
    alert("images loaded!"); 
$.get("content.htm", function(data){ 
    $("#mainContentHolder").replaceWith(data); 
    alert("content is loaded!"); 
}); 
}); 
+0

Pas dans mon cas, car le gestionnaire "images chargées" est supposé se déclencher juste après le gestionnaire "content loaded". Désolé si mon explication n'était pas assez claire. –

+0

Que diriez-vous de mettre .live ("load", function() ... après replaceWith (data)? – bozdoz