Je lie un événement de clic avec un bouton:
$('#myButton').bind('click', onButtonClicked);
Dans un scénario, cela est appelé plusieurs fois, donc lorsque je fais un, trigger
je vois plusieurs appels ajax que je veux empêcher.
Comment puis-je bind
seulement si ce n'est pas lié avant.
Réponses:
Mise à jour du 24 août 2012 : dans jQuery 1.8, il n'est plus possible d'accéder aux événements de l'élément en utilisant
.data('events')
. (Voir ce bogue pour plus de détails.) Il est possible d'accéder aux mêmes données avecjQuery._data(elem, 'events')
, une structure de données interne, qui n'est pas documentée et donc pas garantie à 100% de rester stable. Cela ne devrait cependant pas être un problème, et la ligne correspondante du code du plugin ci-dessus peut être modifiée comme suit:Les événements jQuery sont stockés dans un objet de données appelé
events
, vous pouvez donc rechercher dans ceci:Il serait bien sûr préférable que vous puissiez structurer votre application pour que ce code ne soit appelé qu'une seule fois.
Cela pourrait être encapsulé dans un plugin:
Vous pourriez alors appeler:
la source
<a>
? Parce que quand j'essaye, il ditjQuery._data()
l'erreur suivanteTypeError: a is undefined
var data = jQuery._data(this[0], 'events')[type];
dans une capture d'essai et retournerais false dans la capture. Si aucun événement n'est lié à ce [0], un appel à [type] provoquera une variation de "Impossible d'obtenir la propriété 'clic' d'une référence non définie ou nulle" et évidemment cela vous indique également ce que vous devez savoir.for (var i = 0; i < data.length; i++) { if (data[i].handler.toString() === fn.toString()) { return true; } }
Une autre façon - marquez ces boutons avec une classe CSS et un filtre:
Dans les versions récentes de jQuery, remplacez-le
bind
paron
:la source
Si vous utilisez jQuery 1.7+:
Vous pouvez appeler
off
avanton
:Si non:
Vous pouvez simplement dissocier le premier événement:
la source
.unbind('click', onButtonClicked)
. Voir le manuel$(sel).unbind("click.myNamespace");
$('#myButton').unbind('click', onButtonClicked).bind('click', onButtonClicked);
La meilleure façon que je vois est d'utiliser live () ou delegate () pour capturer l'événement dans un parent et non dans chaque élément enfant.
Si votre bouton est à l'intérieur d'un élément #parent, vous pouvez remplacer:
$('#myButton').bind('click', onButtonClicked);
par
$('#parent').delegate('#myButton', 'click', onButtonClicked);
même si #myButton n'existe pas encore lorsque ce code est exécuté.
la source
J'ai écrit un tout petit plugin appelé "once" qui fait cela. Exécuter et rallumer dans l'élément.
Et simplement:
la source
off
supprime pas tous les gestionnaires pour le type donné? Cela signifie que s'il y avait un gestionnaire de clics distinct non lié mais sur le même élément, celui-ci ne serait-il pas également supprimé?Pourquoi ne pas l'utiliser
unbind()
avantbind()
la source
$('#myButton').off().on('click', onButtonClicked);
fonctionne aussi pour moi.Voici ma version:
Usage:
la source
Basé sur la réponse @ konrad-garus, mais en utilisant
data
, car je pense qu'ilclass
devrait être utilisé principalement pour le style.la source
Pour éviter de vérifier / lier / délier, vous pouvez changer votre approche! Pourquoi n'utilisez-vous pas Jquery .on ()?
Depuis Jquery 1.7, .live (), .delegate () est obsolète, vous pouvez maintenant utiliser .on () pour
Cela signifie que vous pouvez attacher un événement à un élément parent qui existe toujours et attacher des éléments enfants qu'ils soient présents ou non!
Lorsque vous utilisez .on () comme ceci:
Vous attrapez l'événement en cliquant sur le parent et il recherche l'enfant '#myButton' s'il existe ...
Ainsi, lorsque vous supprimez ou ajoutez un élément enfant, vous n'avez pas à vous soucier d'ajouter ou de supprimer la liaison d'événement.
la source
.off
ce qui, je pense, supprimerait les gestionnaires non liés dans le processus.Essayer:
la source
la source
Depuis juin 2019, j'ai mis à jour la fonction (et elle fonctionne pour ce dont j'ai besoin)
la source
JQuery a une solution :
équivalent:
la source