2010-08-16 3 views
1

Voici ma situation:comment jquery et ajax vont-ils ensemble?

J'ai une page en cliquant sur l'un de ses divs une requête ajax récupère plus de contenu à la page.

Le plus de contenu dont je parle est le contenu de la galerie d'images qui utilise jQuery. mon problème est qu'une fois que j'obtiens la réponse de la demande d'ajax, je manipule le DOM. par conséquent la fonction jQuery ready() n'est plus disponible pour moi (ou est-ce?) pour passer le problème j'ai attribué une fonction au $.fn appelé InitGallery.

En utilisant eval je peux l'appeler une fois que ma réponse ajax arrive et tout va bien sauf une petite question-synchronisation!

Une fois que j'ai eval mon code $.fn.InitGallery, le DOM manipulé n'est pas nécessairement complètement chargé, et donc mon InitGallery échoue.

Une fois que j'ajoute une veille ou une alerte à mon code, et que je m'assure que la fonction InitGallery fonctionne après que le DOM soit à nouveau prêt, tout va bien et fonctionne.

Je suppose que ma question est comment est-ce que je peux assigner une fonction prête au DOM? comment puis-je m'assurer que la fonction que j'appelle après que la réponse ajax ne soit appelée qu'après les changements que la réponse ajax a faite sur le DOM est prête? merci

+0

Mal formaté, et un mauvais titre à la question, mais intéressant néanmoins. +1 –

Répondre

0

mettre l'appel à votre fonction init dans le gestionnaire de succès de votre requête ajax.

$.ajax({ 
    url: 'ajax/test.html', 
    success: function(data) { 
    makeYourChanges(); 
    callYourInit(); 

    } 
}); 
1

J'ai besoin plus d'informations, mais ma réponse préliminaire est:

Quelle que soit votre charge contenu ajax doit déclencher un « prêt » événement ou quelque chose de similaire sur le nouveau contenu est fait le chargement. De cette façon, vous pouvez lier votre InitGallery à "prêt" sur cet élément et faire toute votre initialisation après que le dom est prêt.

Qu'est-ce que le chargement de votre contenu via AJAX?

+0

bien, juste une fonction stupide que j'ai écrite. Je pense que je vais le changer pour travailler avec le framework jquery ajax. selon une autre réponse que je suis arrivé: .ajax $ ({url : 'ajax/test.html', succès: function (données) { makeYourChanges(); callYourInit();} }); devrait fonctionner. Avez-vous des idées sur la question? – Oded

+0

'callYourInit()' peut ne pas être aussi simple qu'il n'y paraît. Où est le script qui a la fonction pour le contenu ajax chargé, est-ce dans le contenu, ou est-il déjà inclus? –

3

Vous avez quelques options en fonction de ce que vous essayez de faire. Si vous utilisez la fonction live, vous pouvez câbler vos événements une seule fois et ils continueront à fonctionner après avoir modifié le DOM.

Une autre option est de mettre le code d'initialisation en fonction:

$(function() { 
    doCoolStuff(); 
}); 

Accrocher ensuite à l'événement ajaxComplete ou ajaxSuccess:

$.ajaxComplete(function() { 
    doCoolStuff(); 
}); 
+0

je veux juste signaler que vous avez une erreur de syntaxe dans votre premier extrait –

+0

Merci Bob - l'a corrigé. –

0

Pas besoin d'utiliser l'événement ready() sur le document encore pour cela. l'événement prêt ne se déclenche qu'une seule fois, lorsque le DOM a été chargé initialement.

L'approche pour cela consiste à affecter une fonction à la propriété success de l'objet que vous passez à l'appel ajax; C'est la fonction que vous voulez exécuter une fois la réponse de l'appel terminée.

$.ajax({ 
    url : 'http://some.url', 
    success : function(response) { 
     // do the insert into the DOM. An example 
     // assuming your response is text/html 
     $(document.body).append(response); 

     // now call InitGallery 
     $('#selector').InitGallery(); 
    } 
}); 
0

je vous conseille d'utiliser des outils pour l'Ajax Debugging comme firebug ou firequery récente.