2009-10-03 6 views
157

Existe-t-il un moyen de vérifier si un événement existe dans jQuery? Je travaille sur un plugin qui utilise des événements personnalisés, et j'aimerais pouvoir vérifier si l'événement est lié à un élément ou non.Vérifiez si l'événement existe sur l'élément

+1

donc, en 1.8, tout cela est faux? –

+4

@SkylarSaveland La méthode '$ .data (element," events ")' n'a jamais été officielle. Mais dans jQuery 1.8.0, cette méthode est restée via '$ ._ data (element," events ")'. En savoir plus [ici] (http://blog.jquery.com/2012/08/09/jquery-1-8-released/) – Anton

Répondre

129
$('body').click(function(){ alert('test')}) 

var foo = $.data($('body').get(0), 'events').click 
// you can query $.data(object, 'events') and get an object back, then see what events are attached to it. 

$.each(foo, function(i,o) { 
    alert(i) // guid of the event 
    alert(o) // the function definition of the event handler 
}); 

Vous pouvez inspecter en alimentant la référence d'objet (et non l'objet jQuery bien) à .data $, et pour la deuxième alimentation des arguments « événements » et qui retourne un objet peuplé de tous les événements tels que ' Cliquez sur'. Vous pouvez parcourir cet objet et voir ce que fait le gestionnaire d'événements.

+2

En fait, j'ai mieux aimé votre premier exemple, les événements $ .data (elem, ' ') fournit beaucoup plus d'informations. –

+0

J'ai ajouté cela comme commentaire –

+17

Pourquoi n'utilisez-vous pas simplement $ ('body'). Data ('events')? – James

24

utilisation événement jquery filtre

vous pouvez l'utiliser comme ceci

$("a:Event(click)") 
+33

Hah, merci, construit ce plugin après avoir reçu la réponse de Meder il y a des mois. –

+19

A partir du 1.8, ce plugin ne fonctionne plus –

+3

J'adore ça, en postant un plugin OP créé comme réponse à sa question :) – Andy

5

J'ai écrit un plugin appelé hasEventListener qui fait exactement cela.

Espérons que cela aide.

+1

Le problème est, comment ça marche? Je suis là depuis quelques heures, et ce n'est toujours pas clair. Je veux juste vérifier s'il y a un événement click, et récupérer un booléen, pas un objet, mais la plupart des méthodes que vous fournissez, au moins les exemples, sont beaucoup plus compliquées. Fait intéressant: http://www.codingjack.com/playground/jquick/#haseventlistener, mais je n'utilise pas jquick, mais j'aime cette simplicité propre. –

62

Vous pouvez utiliser:

$("#foo").unbind('click'); 

pour vous assurer que tous les événements de clic sont unbinded, puis attachez votre événement

+1

Ne vous aidez pas si vous avez utilisé live pour enregistrer l'événement. http://stackoverflow.com/questions/12755646/jquery-datatables-multiple-calls-to-event-handler-with-live-function –

+25

La question est de vérifier si l'événement existe sur l'élément et non comment annuler les événements existants ... – Avi

+35

@Avi, c'est toujours une bonne réponse, car dans de nombreux cas, la question est posée avec le problème à l'esprit: "Comment ne pas enregistrer un gestionnaire deux fois?" – hans

3

Ci-dessous le code vous fournira tous les événements de clic sur sélecteur donné:

jQuery(selector).data('events').click 

Vous pouvez itérer dessus avec ou par ex. vérifier la longueur pour la validation comme:

jQuery(selector).data('events').click.length 

Pensé que cela aiderait quelqu'un. :)

+1

Ne fonctionne plus dans jQuery> = 1.8. Voir la réponse de Tom Gerken pour une solution de travail. – jbandi

25

Voici comment vérifier si un événement existe pour un élément

<html> 
<head> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js" type="text/javascript"></script> 
    <script> 
     $(function() { 
      $("#textDiv").click(function() { 
       //Event Handling 
      }); 
      var events = $._data(document.getElementById('textDiv'), "events"); 
      var hasEvents = (events != null); 
     }); 
    </script> 
</head> 
<body> 
<div id="textDiv">Text</div> 
</body> 
</html> 
+0

Je pense que vous pouvez simplifier ceci en utilisant: var eventBound = (events! = Null); –

+0

Cette solution fonctionne avec jQuery 1.8.0 plus tard. Merci beaucoup Ton Gerken :) –

-1

J'ai fini par faire ce

typeof ($('#mySelector').data('events').click) == "object" 
0

Ce travail pour moi montre les objets et le type d'événement qui s'est produit.

var foo = $._data($('body').get(0), 'events'); 
    $.each(foo, function(i,o) { 
    console.log(i); // guide of the event 
    console.log(o); // the function definition of the event handler 
    }); 
Questions connexes