Question La meilleure façon de supprimer un gestionnaire d'événement dans jQuery?


j'ai un input type="image". Cela agit comme les notes de cellule dans Microsoft Excel. Si quelqu'un entre un nombre dans la zone de texte que cette input-image est couplé avec, je configure un gestionnaire d'événements pour le input-image. Ensuite, lorsque l'utilisateur clique sur le image, ils obtiennent un petit popup pour ajouter quelques notes aux données.

Mon problème est que lorsqu'un utilisateur entre un zéro dans la zone de texte, je dois désactiver le input-imagele gestionnaire d'événements. J'ai essayé ce qui suit, mais en vain.

$('#myimage').click(function { return false; });

969
2017-10-16 15:28


origine


Réponses:


jQuery ≥ 1,7

Avec jQuery 1.7, l'API d'événement a été mise à jour, .bind()/.unbind() sont toujours disponibles pour la rétrocompatibilité, mais la méthode préférée utilise le sur()/de() les fonctions. Le ci-dessous serait maintenant,

$('#myimage').click(function() { return false; }); // Adds another click event
$('#myimage').off('click');
$('#myimage').on('click.mynamespace', function() { /* Do stuff */ });
$('#myimage').off('click.mynamespace');

jQuery <1,7

Dans votre exemple de code, vous ajoutez simplement un autre événement de clic à l'image, sans écraser le précédent:

$('#myimage').click(function() { return false; }); // Adds another click event

Les deux événements de clic seront alors déclenchés.

Comme les gens l'ont dit, vous pouvez utiliser unbind pour supprimer tous les événements de clic:

$('#myimage').unbind('click');

Si vous souhaitez ajouter un seul événement, puis le supprimer (sans en supprimer d'autres éventuellement ajoutés), vous pouvez utiliser l'espace de noms d'événements:

$('#myimage').bind('click.mynamespace', function() { /* Do stuff */ });

et pour supprimer uniquement votre événement:

$('#myimage').unbind('click.mynamespace');

1494
2017-10-16 21:13



Ce n'était pas disponible lorsque cette question a été répondue, mais vous pouvez également utiliser le vivre() méthode pour activer / désactiver les événements.

$('#myimage:not(.disabled)').live('click', myclickevent);

$('#mydisablebutton').click( function () { $('#myimage').addClass('disabled'); });

Ce qui se passera avec ce code est que lorsque vous cliquez sur #mydisablebutton, il ajoutera la classe désactivée à l'élément #myimage. Cela fera en sorte que le sélecteur ne corresponde plus à l'élément et que l'événement ne sera pas déclenché tant que la classe 'disabled' n'aura pas été supprimée, rendant le sélecteur .live () de nouveau valide.

Ceci a d'autres avantages en ajoutant le style basé sur cette classe aussi bien.


59
2017-07-23 17:57



Cela peut être fait en utilisant la fonction unbind.

$('#myimage').unbind('click');

Vous pouvez ajouter plusieurs gestionnaires d'événements au même objet et événement dans jquery. Cela signifie que l'ajout d'un nouveau ne remplace pas les anciens.

Il existe plusieurs stratégies pour modifier les gestionnaires d'événements, tels que les espaces de noms d'événements. Il y a quelques pages à ce sujet dans les documents en ligne.

Regardez cette question (c'est comme ça que j'ai appris de unbind). Il y a une description utile de ces stratégies dans les réponses.

Comment lire les fonctions de rappel de hover lié dans jquery


37
2017-10-16 15:35



Si vous voulez répondre à un événement juste une fois, la syntaxe suivante devrait être vraiment utile:

 $('.myLink').bind('click', function() {
   //do some things

   $(this).unbind('click', arguments.callee); //unbind *just this handler*
 });

En utilisant arguments.callee, nous pouvons nous assurer que le gestionnaire de fonction anonyme spécifique est supprimé, et donc, avoir un gestionnaire de temps unique pour un événement donné. J'espère que cela aide les autres.


34
2017-08-05 07:29



peut-être la méthode unbind travaillera pour vous

$("#myimage").unbind("click");

29
2017-10-16 15:31



J'ai dû mettre l'événement à zéro en utilisant le prop et l'attr. Je ne pouvais pas le faire avec l'un ou l'autre. Je n'ai pas pu obtenir .unbind pour travailler. Je travaille sur un élément TD.

.prop("onclick", null).attr("onclick", null)

29
2018-03-28 14:44



Vous pouvez ajouter le onclick gestionnaire comme balisage en ligne:

<input id="addreport" type="button" value="Add New Report" onclick="openAdd()" />

Si oui, la jquery .off() ou .unbind() ne fonctionnera pas. Vous devez également ajouter le gestionnaire d'événements original dans jquery:

$("#addreport").on("click", "", function (e) {
   openAdd();
});

Ensuite, jquery a une référence au gestionnaire d'événements et peut l'enlever:

$("#addreport").off("click")

VoidKing mentionne ceci un peu plus obliquement dans un commentaire ci-dessus.


10
2018-01-21 22:25



Si l'événement est joint par iciet la cible doit être détachée:

$('#container').on('click','span',function(eo){
    alert(1);

    $(this).off(); //seams easy, but does not work

    $('#container').off('click','span'); //clears click event for every span

    $(this).on("click",function(){return false;}); //this works.

});​

9
2018-06-26 13:02