Jquery datatables appels multiples au gestionnaire d'événements avec fonction en direct

J'utilise jquery dataatables pour afficher certaines données. Chaque ligne a un bouton d'édition pour lequel j'inscrit un gestionnaire de clics avec live (), de sorte qu'il fonctionne avec la pagination. Je le fais par classe, car je dois le faire pour chaque rang. Quelque chose comme: Datatables with live click event function

Cela fonctionne bien. Mais le problème se produit lorsque l'utilisateur fait une recherche à nouveau et je fais une requête ajax pour récupérer un nouvel ensemble de résultats.

Je viens de remplacer le tableau existant par un nouveau. Maintenant, quand je clique sur la ligne 1, il apparaît la boîte de dialogue d'édition pour la ligne 1. Je clique sur la ligne 2, il apparaît la boîte de dialogue d'édition pour la ligne 1. Je clique sur la ligne 2 à nouveau, elle affiche la boîte de dialogue d'édition pour la ligne 2 cette fois.

Ensuite, je clique sur la ligne 3 encore et encore. Il apparaît la boîte de dialogue d'édition pour la ligne 2 trois fois avant de montrer la boîte de dialogue pour la ligne 3.

Cela continue d'augmenter. Je ne comprends pas si je remplace le tableau de données entier dans le div avec jquery pourquoi devrait-il enregistrer plusieurs événements?

Dans l'éventualité d'être important, j'ai automatiquement mis au point l'option autoopen dans mon initialiseur de dialogue et je l'ouvre et ferme de façon explicite.

Modifier (Plus de détails) :

J'ai du mal à créer un exemple … mais plus de détails … J'ai compris que, puisque j'utilise la fonction live () pour enregistrer les appels à travers la pagination, le mécanisme d'enregistrement par clic existe. Donc, lorsque je remplace le tableau par la même structure, la fonction de clic est enregistrée en raison du premier appel à vivre (). Mais je fais un autre appel à vivre () par défaut et maintenant deux événements de clic sont enregistrés. Ensuite, lorsque je remplace à nouveau, trois clics d'événement sont enregistrés. J'ai essayé de résoudre ce problème en enregistrant des événements avec jquery click () après avoir vérifié si un événement de clic était déjà enregistré. Aide avec la partie des événements multiples mais n'inscrit pas d'événements sur les pages de données.

Ont eu ce problème avec live et ajax. Ce que j'ai fini de faire, c'est que j'ai réenregistré les clics de l'événement lors de la réception d'une réponse ajax. Sans un exemple, il est difficile de recommander une solution, mais l'idée est de joindre les événements de clic sur le chargement de la page en utilisant bind / click (pour l'affichage par défaut / initial), puis réenregistrer les événements de clic à nouveau sur une réponse ajax réussie. Bien sûr, placer le code de liaison d'événement dans un composant réutilisable tel qu'une fonction pour pouvoir l'appeler facilement.

Correction du problème

Le problème était que je ne pouvais pas simplement m'inscrire pour un événement de clic sur les éléments dans les lignes de données. Les événements ne seraient pas enregistrés sur les pages disponibles.

En utilisant live () pour enregistrer les événements ont aidé et sur la page changer les événements seraient enregistrés automatiquement.

Mais pour mon usecase qui a mené à un autre problème à chaque fois que je faisais une recherche, je remplacerais la base de données par une nouvelle. La nouvelle base de données s'inscrire à ces événements à nouveau. Cela signifiait que plusieurs manipulateurs étaient appelés pour le même élément. Parce que la fonction live () a été appelée deux fois sur la même classe et jquery ne devrait pas comparer si deux gestionnaires de rappel sont identiques.

J'ai tourné dans une direction différente et j'ai essayé d'enregistrer des événements de clic en utilisant .click () à la place de .live () sur la modification de page à l'aide de l'événement de la page ( http://datatables.net/docs/DataTables/1.9.beta.1/ #page_details ). Cela n'a pas aidé depuis les événements où l'événement de changement de page a été invoqué avant que le contenu ne soit actualisé avec les événements sur la nouvelle page.

J'ai également essayé d'utiliser le clic () au lieu de Live () et le lien de liaison seulement s'il n'avait pas déjà été enregistré en utilisant l'exemple donné ici https://stackoverflow.com/a/6361507/161628 . Cette technique a fonctionné sur le remplacement de table mais pas sur plusieurs pages.

En fin de compte, j'ai trouvé la fonction .die (). Je l'invoque avant d'appeler la fonction live (). L'appel à la vie () garantit que les gestionnaires d'événements sont enregistrés sur le changement de page pendant que l'appel à mourir () assure que je désinsérre des événements en direct () précédemment sur des éléments de cette classe. J'évite plusieurs appels à vivre () fonctionnent de cette façon.