2010-07-30 9 views
0

J'ai migré des frameworks de prototype vers jQuery dans mes applications Rails, et je rencontre un problème constant sur lequel j'ai besoin de conseils.Question de stratégie jQuery

Souvent, je vais utiliser une fonction AJAX qui met à jour une partie de la page. Lorsque cela se produit, tout autre Javascript que j'utilise et qui se rapporte à la section de la page qui a été mise à jour ne fonctionne plus. Quel est le meilleur moyen de contourner cela?

La plupart de mes fichiers javascript se trouvent dans jQuery (document) .ready (function() {}); avec certaines fonctions qui vivent en dehors de cette méthode. J'ai contourné ceci en m'appuyant sur le gestionnaire jQuery .live(), ou en appelant la fonction que je veux 'réinitialiser' dans mes fichiers js.erb.

Quelle est la meilleure approche? Dois-je:

  • appeler explicitement des fonctions par nom au travail dans le cadre du rappel pour les amener à travailler
  • continuer à utiliser les .live() pour soumettre/cliquez sur les événements
  • ou est-il mieux, manière plus efficace de faire face à ce

Dans l'attente de vos commentaires tout le monde et merci pour vos conseils.

-A

+0

Je ne comprends pas comment la question de l'appel de fonctions en dehors de '.ready()' par le nom se rapporte à l'utilisation de '.live()'. – user113716

Répondre

0

aressidi - vous pouvez également utiliser .livequery() car cela encapsule avec quelques cloches et de sifflets supplémentaires pour callbacks etc. également, .live() envisager d'utiliser .unbind() pour certains gestionnaires d'événements (comme toggle etc).

plus d'info ici: http://docs.jquery.com/Plugins/livequery

jim

+0

Salut Jim, merci pour votre réponse. J'ai travaillé principalement sur votre réponse et nicholasklick ci-dessous. J'ai réalisé que c'était le basculement qui causait des problèmes après le remplacement d'une partie de la page avec AJAX. J'ai trouvé un article sur comment créer votre propre gestionnaire de bascule et l'encapsuler dans .live(). Voici le lien: http://stackoverflow.com/questions/2172614/using-jquery-live-with-toggle-event. Le seul problème est que cela ne fonctionne que pour un cycle - montrer et cacher. Si je clique dessus, rien ne se passe. Une idée de pourquoi c'est? – aressidi

0

Dans votre callbacks utiliser trigger() pour déclencher des événements. Utilisez live() pour les événements liés aux zones du DOM en cours de mise à jour.

J'utilise toujours ce modèle:

Ajax:

$(.link).live("click", function(){ 
    $.ajax({ 
     url: '/controller/action', 
     success: function(response){ 
     $(document).trigger("event_name", ["method", response]); 
     $('.class').html(response.html); 
     } 
    }); 
}) 

l'action Rails (contenu rerender d'une partielle):

class Controller < ApplicationController 

def action 
    render :json => { 
      :html => render_to_string(
      :partial => 'partial_name', 
      :locals => {:var => @var} 
     ) 
     } 
end 
+0

Salut Nicholasklick, merci pour votre réponse. J'ai posté un suivi sous la réponse de Jim ci-dessus que vous pourriez être en mesure d'aider aussi. Vos deux réponses sont utiles. Merci encore – aressidi