Comment supprimer tous les gestionnaires d'événements de clic à l'aide de jQuery?

121

J'ai un problème. Fondamentalement, lorsqu'un utilisateur clique sur un lien "Modifier" sur une page, le code Jquery suivant s'exécute:

$("#saveBtn").click(function () {
    saveQuestion(id);
});

En faisant cela, l'événement onClick du bouton Enregistrer appelle la saveQuestion()méthode et transmet l'ID de la question pour laquelle le lien «Modifier» a été cliqué.

Mais si dans la même session l'utilisateur clique sur Modifier sur 2 questions, alors au lieu d'écraser le clickgestionnaire d'événements précédent , il provoque à la place l'exécution de 2 gestionnaires d'événements, l'un qui peut appeler saveQuestion(1)et l'autre peut appeler saveQuestion(2). En faisant cette 1 question écrase l'autre.

Existe-t-il un moyen de supprimer tous les clickévénements précédents qui ont été attribués à un bouton?

Cliquez sur Upvote
la source

Réponses:

203

Vous utiliseriez off () pour supprimer un événement comme ceci:

$("#saveBtn").off("click");

mais cela supprimera tous les événements de clic liés à cet élément. Si la fonction avec SaveQuestion est le seul événement lié, ce qui précède le fera. Sinon, procédez comme suit:

$("#saveBtn").off("click").click(function() { saveQuestion(id); });
TStamper
la source
31
Depuis jQuery 1.7, vous devriez utiliser on et off au lieu de lier et délier
Ralph Jansen
@LockTar pouvez-vous suggérer comment cela devrait être écrit à la place?
John Magnolia
@JohnMagnolia Voir mes modifications ci-dessus.
Ralph Jansen
1
.addAttr ('onclick'); ou .removeAttr ('onclick');
Aliti le
13

Existe-t-il un moyen de supprimer tous les événements de clic précédents qui ont été attribués à un bouton?

$('#saveBtn').unbind('click').click(function(){saveQuestion(id)});
Rafael
la source
unbind()est obsolète à partir de jQuery 3.0, et l'utilisation de off()est encouragée depuis la 1.7.
Skylar Ittner
7
$('#saveBtn').off('click').click(function(){saveQuestion(id)});
Fo Nko
la source
2

Si vous avez utilisé ...

$(function(){
    function myFunc() {
        // ... do something ...
    };
    $('#saveBtn').click(myFunc);
});

... alors il sera plus facile de se dissocier plus tard.

Jarrett Meyer
la source
1
Comment voyez-vous? Peu importe la façon dont les événements d'un élément sont liés, ils peuvent toujours être dissociés de la même manière ... $ ('# saveBtn'). Unbind ('quel que soit l'événement (s)'); Maintenant, pour RE-BIND ... oui, votre technique peut être plus facile dans certaines circonstances.
KyleFarris
1
Si vous dissociez tous les événements de clic, ce n'est pas différent. Mais si vous ne vouliez dissocier qu'une action spécifique, je ne voudrais pas réécrire cet événement à deux endroits. Et comme vous l'avez dit, si je veux le relier plus tard, c'est encore plus facile à faire, car je n'ai pas à écrire la fonction une troisième fois.
Jarrett Meyer
0
$('#saveBtn').off('click').on('click',function(){
   saveQuestion(id)
});

Utilisez jquery est hors et sur

Ninjaneer
la source