136 votes

Comment vérifier si événement de clic est déjà lié - JQuery

Je suis lie un événement click d’un bouton :

Dans un scénario, c’est obtenir appelé plusieurs fois, alors quand je fais un `` je vois plusieurs appels ajax que je veux éviter.

Comment faire pour `` seulement si ce n’est pas lié à l’avant.

187voto

Konrad Garus Points 19280

Une autre façon - marquer ces boutons avec une classe CSS et un filtre :

Dans jQuery récente versions remplacent avec :

120voto

lonesomeday Points 95456

jQuery événements sont stockés dans un objet de données appelés events, de sorte que vous pourriez chercher dans ce:

var button = $('#myButton');
if (-1 !== $.inArray(onButtonClicked, button.data('events').click) {
    button.click(onButtonClicked);
}

Il serait mieux, bien sûr, si vous pouviez la structure de votre application, de sorte que ce code n'est appelé qu'une fois.


Cela pourrait être encapsulé dans un plugin:

$.fn.isBound = function(type, fn) {
    var data = this.data('events')[type];

    if (data === undefined || data.length === 0) {
        return false;
    }

    return (-1 !== $.inArray(fn, data));
};

Vous pouvez ensuite appeler:

var button = $('#myButton');
if (!button.isBound('click', onButtonClicked)) {
    button.click(onButtonClicked);
}

Mise à jour 24 Août '12: jQuery 1.8, il n'est plus possible d'accéder à l'élément événements à l'aide de .data('events'). (Voir ce bug pour plus de détails.) Il est possible d'accéder aux mêmes données avec jQuery._data(elem, 'events'), une structure de données interne, qui est sans papiers et n'est donc pas garanti à 100% rester stable. Cela ne devrait pas, cependant, d'être un problème, et la ligne du plugin code ci-dessus peut être modifié à la suivante:

var data = jQuery._data(this[0], 'events')[type];

63voto

Neal Points 68710

Appelez avant :

8voto

Pablonete Points 552

La meilleure façon que je vois est d’utiliser live() ou delegate() pour capturer l’événement chez un parent et non pas dans chaque élément enfant.

Si votre bouton est à l’intérieur d’un élément de #parent, vous pouvez remplacer :

``

par

``

même si #myButton n’existe pas encore lorsque ce code est exécuté.

3voto

Yair Galler Points 31

Voici ma version :

Utilisation :

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