7
votes

Lorsque vous faites un .replacewith () dans JQuery, les liaisons d'événements ne sont pas préservées

Gardez à l'esprit que la classe de réponse .chat a un gestionnaire d'événements de clic liée à elle. p>

Le bouton HTML (Bouton de réponse): P>

$.ajax({
      type      :  'GET',
      url       :  '/some_controller/some_method',
      success   :  function(data) {

      $('.container').replaceWith(data);
    }
});


0 commentaires

4 Réponses :


3
votes

Grab jQuery 1.7 qui utilise maintenant "sur" pour lier: http://blog.jquery.com/2011/09/28/JQUERY-1-7-BETA-RELED/

ou si <1.7 Utilisez "LIVE" au lieu de «Reliez» car il recherchera des modifications DOM et de réappliquer les événements du contenu modifié. Sinon, vous pouvez réappliquer l'événement sur votre rappel.

API Old API au remplacement pour se lier avec des gestionnaires d'événements de type en direct après des modifications DOM.

Ceci $ (sélecteur) .Live (événements, fn)

devient ceci $ (document) .on (événements, sélecteur, fn)

ou dans le code

ceci xxx

devient ceci en 1.7 xxx P> Avec diverses options pour sélectionner l'objet que vous souhaitez.


2 commentaires

Votre exemple de code est un peu déroutant pour moi. Si cela ne vous dérange pas de clarifier un peu, ce serait génial.


Sry Le bloc venait juste de pointer de vieux "Live" à "On", mais l'exemple de Vigrond est la façon dont vous faites un "sur". Il serait presque préférable de joindre l'événement après la réception du code HTML dans votre rappel.



2
votes

Dans votre gestionnaire de clic, utilisez .on () en tant que délégué xxx

l'événement "bubble" jusqu'à conteneur et s'il correspond à A.chat-Replay, il déclenchera .


7 commentaires

Le "bouillonnement" a cependant fonctionné une fois que je fais un remplacement, ces liaisons d'événements ont disparu - toujours.


bien sûr. Mon mauvais, Remplacera remplacera l'élément entier. Est-il possible pour vous de faire .html (contenu) à la place? Cela remplacera son contenu, pas l'élément .Container. Sinon, vous devrez commencer à regarder les ancêtres de .Container pour attacher le gestionnaire d'événements.


Ewww. Cela peut devenir méchant. J'ai trouvé un autre post qui a suggéré d'avoir une fonction «fils-up» de la liaison de l'événement. Puis appelez-le à nouveau après le remplacement. Ce n'est pas joli mais je pourrais avoir beaucoup de choix.


En outre, j'ai pensé à l'approche .html (contenu), mais c'est juste trop d'autres choses qui continuent, à la fin de la fin de cette approche efficace.


Voici un lien vers la question similaire: Stackoverflow.com/questions / 770308 / ...


Ok, il est difficile de vous donner une réponse précise si vous ne vous détachez pas.


Je comprend. Et j'apprécie votre aide. J'ai condensé l'exemple pour se concentrer davantage sur l'aspect le plus important. Ce qui est retourné de l'appel .ajax (c'est-à-dire la variable de données), je me suis sentie n'était pas pertinente parce que je ne suis pas au point où je envisagerais de modifier les données renvoyées de mon contrôleur. J'espère que cela à du sens.



1
votes

Décidé sur une solution plutôt non si élégante Merci en partie à ce message: événements non Enregistrement après le remplacement,

J'ai créé une fonction appelée méblotchailzy () qui lie un événement de clic sur le bouton .chat-Répondre.

Puis, après le remplacement, je fais un appel à la méblure () pour reculer les événements. Je fais le même appel à la méblure sur le document.Ready.

Ce n'est pas joli mais ça marche.


0 commentaires

0
votes

Les deux réponses concernant les événements en direct ne résolvent pas le problème, car le conteneur lui-même est remplacé et la liaison de l'événement est partie.

Au lieu de reculer les événements, auquel cas vous devez connaître les événements déjà liés, vous pouvez procéder comme suit: xxx

ou, s'il y a plusieurs conteneurs: xxx


0 commentaires