J'ai besoin de savoir quels gestionnaires d'événements sont enregistrés sur un objet.
Par exemple:
$("#el").click(function() {...});
$("#el").mouseover(function() {...});
$("#el")
a un clic et un survol enregistrés.
Existe-t-il une fonction pour le découvrir et éventuellement parcourir les gestionnaires d'événements?
Si ce n'est pas possible sur un objet jQuery par des méthodes appropriées, est-ce possible sur un objet DOM ordinaire?
var events = (jQuery._data || jQuery.data)(elem, 'events');
Réponses:
Depuis jQuery 1.8, les données d'événement ne sont plus disponibles à partir de "l'API publique" pour les données. Lisez cet article de blog jQuery . Vous devriez maintenant utiliser ceci à la place:
elem
doit être un élément HTML, pas un objet jQuery ou un sélecteur.Veuillez noter qu'il s'agit d'une structure interne «privée» et ne doit pas être modifiée. Utilisez-le uniquement à des fins de débogage.
Dans les anciennes versions de jQuery, vous pourriez avoir à utiliser l'ancienne méthode qui est:
la source
$._data($(elem).get(0), "events")
handler: function () {
à l'intérieur de la propriété click. J'ai dû double-cliquer sur la partie fonction pour qu'elle se développe et affiche le contenu complet de la fonction.var events = (jQuery._data || jQuery.data)(elem, 'events');
Vous pouvez le faire en explorant les événements (à partir de jQuery 1.8+), comme ceci:
Voici un exemple avec lequel vous pouvez jouer:
la source
jQuery._data( jQuery("#el")[0], "events" );
lieu de la méthode « données publiques »:jQuery("#el").data("events")
. L'events
objet n'a en fait pas été stocké.data()
depuis longtemps, nous avons supprimé quelques octets de code en supprimant ce "proxy" de l '"API publique"Pour jQuery 1.8+, cela ne fonctionnera plus car les données internes sont placées dans un objet différent.
La dernière façon non officielle (mais qui fonctionne également dans les versions précédentes, au moins en 1.7.2) est maintenant -
$._data(element, "events")
Le trait de soulignement ("_") fait la différence ici. En interne, il appelle
$.data(element, name, null, true)
, le dernier (quatrième) paramètre est interne ("pvt").la source
jQuery._data( element, "events" )
c'est la façon «correcte» d'obtenir ces informations maintenant.Prise sans vergogne , mais vous pouvez utiliser findHandlerJS
Pour l'utiliser, il vous suffit d'inclure findHandlersJS (ou simplement de copier-coller le code javascript brut dans la fenêtre de la console de chrome) et de spécifier le type d'événement et un sélecteur jquery pour les éléments qui vous intéressent.
Pour votre exemple, vous pouvez trouver rapidement les gestionnaires d'événements que vous avez mentionnés en faisant
C'est ce qui est retourné:
L' élément réel dans lequel le gestionnaire d'événements a été enregistré
Tableau contenant des informations sur les gestionnaires d'événements jquery pour le type d'événement qui nous intéresse (par exemple, clic, modification, etc.)
Méthode de gestionnaire d'événements réels que vous pouvez voir en cliquant dessus avec le bouton droit et en sélectionnant Afficher la définition de la fonction
Le sélecteur fourni pour les événements délégués. Il sera vide pour les événements directs.
Liste avec les éléments que ce gestionnaire d'événements cible. Par exemple, pour un gestionnaire d'événements délégué qui est enregistré dans l'objet document et cible tous les boutons d'une page, cette propriété répertorie tous les boutons de la page. Vous pouvez les survoler et les voir surlignés en chrome.
Vous pouvez l'essayer ici
la source
J'utilise eventbug plugin Firebug à cette fin.
la source
J'ai combiné les deux solutions de @jps à une seule fonction:
Mais attention, cette fonction ne peut renvoyer que les événements définis à l'aide de jQuery lui-même.
la source
Depuis la version 1.9, il n'existe aucun moyen documenté de récupérer les événements, à part utiliser le plug-in Migrate pour restaurer l'ancien comportement. Vous pouvez utiliser la méthode _.data () comme le mentionne jps, mais il s'agit d'une méthode interne. Faites donc ce qu'il faut et utilisez le plugin Migrate si vous avez besoin de cette fonctionnalité.
Depuis la documentation jQuery sur
.data("events")
la source
jQuery._data( elem, "events" );
...Pour rechercher des événements sur un élément:
Par exemple:
ou
Exemple complet:
Une façon plus complète de vérifier, qui inclut des écouteurs dynamiques, installés avec $ (document) .on
Exemple d'utilisation:
la source
getEvents
méthode est globalement géniale, mais le fait est qu'elle donne des entrées en double dans IE11 (je sais, IE à nouveau, mais les entreprises en ont besoin ...). EDIT: $ ._ data contient des événements en double pour l'élément, même si sur FF, il ne contient aucun ... monde IE bizarre. Mais il est important de faire attention à cette possibilité d'avoir des événements en double.J'ai créé un sélecteur jQuery personnalisé qui vérifie à la fois le cache jQuery des gestionnaires d'événements affectés ainsi que les éléments qui utilisent la méthode native pour les ajouter:
Exemple:
Cela renverra des éléments auxquels un gestionnaire de clics est attaché.
la source
Dans un navigateur moderne avec ECMAScript 5.1 /
Array.prototype.map
, vous pouvez également utiliserdans la console de votre navigateur, qui affichera la source des gestionnaires, séparés par des virgules. Utile pour jeter un œil à tout ce qui se déroule sur un événement particulier.
la source
jQuery._data('ct100_ContentPlaceHolder1_lcsSection','events')["EVENT_NAME"].map(function(elem){return elem.handler;});
TypeError non capturé: impossible de lire la propriété 'EVENT_NAME' de non défini à <anonyme>: 1: 62'ct100_ContentPlaceHolder1_lcsSection'
est une chaîne, pas un élément DOM.Les événements peuvent être récupérés en utilisant:
ou jQuery 1.8+:
Remarque: Les événements liés à l'aide
$('selector').live('event', handler)
peuvent être récupérés à l'aide de:la source
Je dois dire que la plupart des réponses sont intéressantes, mais récemment, j'ai eu un problème similaire et la solution était extrêmement simple en suivant la voie DOM. C'est différent parce que vous n'itérez pas mais visez directement l'événement dont vous avez besoin, mais ci-dessous, je donnerai une réponse plus générale.
J'avais une image d'affilée:
Et cette image était associée à un gestionnaire d'événements Click:
Mon intention était d'étendre la zone cliquable à toute la ligne, j'ai donc d'abord obtenu toutes les images et les lignes relatives:
Maintenant, dans la ligne de réponse réelle , je viens de faire comme suit, en donnant une réponse à la question d'origine:
J'ai donc récupéré le gestionnaire d'événements directement à partir de l'élément DOM et l'ai placé dans le gestionnaire d'événements click jQuery. Fonctionne comme un charme.
Passons maintenant au cas général. Dans les anciens jours pré-jQuery, vous pouviez obtenir tous les événements attachés à un objet avec deux fonctions simples mais puissantes offertes aux mortels par Douglas Crockford :
la source
Essayez le plug-in de débogage jquery si vous utilisez Chrome: https://chrome.google.com/webstore/detail/jquery-debugger/dbhhnnnpaeobfddmlalhnehgclcmjimi?hl=en
la source
Une autre façon de le faire est d'utiliser simplement jQuery pour saisir l'élément, puis de parcourir le Javascript réel pour obtenir et définir et jouer avec les gestionnaires d'événements. Par exemple:
la source
J'ai combiné certaines des réponses ci-dessus et créé ce script fou mais fonctionnel qui répertorie, espérons-le, la plupart des auditeurs d'événements sur l'élément donné. N'hésitez pas à l'optimiser ici.
la source
jQuery ne vous permet pas d'accéder simplement aux événements d'un élément donné. Vous pouvez y accéder en utilisant une méthode interne non documentée
Mais cela ne vous donnera toujours pas tous les événements, pour être précis ne vous montrera pas les événements assignés avec
Ces événements sont stockés dans le document, vous pouvez donc les récupérer en parcourant
mais c'est un travail difficile, car il y a des événements pour toute la page Web.
Tom G ci-dessus a créé une fonction qui filtre le document uniquement pour les événements de l'élément donné et fusionne la sortie des deux méthodes, mais il comportait un défaut de duplication des événements dans la sortie (et en fait sur la liste d'événements internes jQuery de l'élément qui dérange votre application). J'ai corrigé cette faille et vous pouvez trouver le code ci-dessous. Collez-le simplement dans votre console de développement ou dans le code de votre application et exécutez-le si nécessaire pour obtenir une belle liste de tous les événements pour l'élément donné.
Ce qui est important à noter, l'élément est en fait HTMLElement, pas l'objet jQuery.
la source