1113 votes

Meilleur moyen de supprimer un gestionnaire d'événement dans jQuery ?

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

Mon problème est que lorsqu'un utilisateur saisit un zéro dans la zone de texte, je dois désactiver la fonction input-image du gestionnaire d'événements. J'ai essayé ce qui suit, mais sans succès.

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

1732voto

samjudson Points 27483

JQuery ≥ 1.7

À partir de la version 1.7 de jQuery, l'API des événements a été mise à jour, .bind() / .unbind() sont toujours disponibles pour des raisons de rétrocompatibilité, mais la méthode préférée est l'utilisation de la fonction on() / off() fonctions. Le 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 remplacer 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 d'autres l'ont dit, vous pouvez utiliser unbind pour supprimer tous les événements de clic :

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

Si vous voulez ajouter un seul événement puis le supprimer (sans supprimer les autres qui auraient pu être ajoutés), vous pouvez utiliser l'espacement des noms des événements :

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

et de supprimer uniquement votre événement :

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

6 votes

Existe-t-il un moyen de tester si unbind() fonctionne ? Je l'ai ajouté et les deux événements se déclenchent toujours.

19 votes

Eh bien, si les deux événements se déclenchent toujours, alors il est évident que ça ne fonctionne pas. Vous devez donner plus d'informations pour obtenir une réponse correcte. Essayez de poser une autre question.

15 votes

Vieille réponse - j'aime aussi les informations sur l'espace de noms inclus - mais j'ai oublié ; est-ce que on/off renvoie l'objet jQ ? Si c'est le cas, peut-être qu'une réponse plus complète serait de faire une marguerite : $('#myimage').off('click').on('click',function(){...})

64voto

MacAnthony Points 2327

Cette fonction n'était pas disponible au moment de la réponse à cette question, mais vous pouvez également utiliser la fonction live() pour activer/désactiver les événements.

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

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

Ce qui se passe avec ce code, c'est que lorsque vous cliquez sur #mydisablebutton, il ajoute la classe disabled à l'élément #myimage. Ainsi, le sélecteur ne correspondra plus à l'élément et l'événement ne sera pas déclenché tant que la classe "disabled" ne sera pas supprimée, rendant le sélecteur .live() à nouveau valide.

Cela présente d'autres avantages en ajoutant également un style basé sur cette classe.

3 votes

Bonne façon d'utiliser live() Je n'avais jamais pensé à l'utiliser de cette façon auparavant... En dehors de la commodité du codage, est-ce plus rapide ou présente-t-il d'autres avantages par rapport à l'utilisation de la liaison/déliaison ?

2 votes

Si vous ajoutez/supprimez des éléments, il y a des avantages certains en termes de performances par rapport à bind, car la liaison avec live n'est effectuée qu'une seule fois. jQuery semble s'orienter vers plus d'événements live et délégués plutôt que de se lier à des éléments spécifiques.

3 votes

Pour désactiver le direct, vous pouvez utiliser die()

40voto

Mnebuerquo Points 1664

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 au même événement dans jquery. Cela signifie que l'ajout d'un nouveau gestionnaire ne remplace pas les anciens.

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

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

Comment lire les fonctions de rappel de survol liées dans jquery ?

39voto

ghayes Points 4661

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

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

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

Utilisation de arguments.demandeur nous pouvons nous assurer que le gestionnaire de la fonction anonyme spécifique est supprimé, et ainsi avoir un seul gestionnaire de temps pour un événement donné. J'espère que cela aidera d'autres personnes.

2 votes

Absolument, bien que parfois vous puissiez souhaiter avoir une certaine logique sur le moment où le gestionnaire doit être délié (par exemple, ne pas délier s'il n'a pas d'abord rempli une zone de texte).

8 votes

Arguments.callee est dépravé en mode strict !

36voto

John Boker Points 36308

Peut-être que la méthode de déliaison fonctionnera pour vous

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X