jQuery trouver des gestionnaires d'événements enregistrés avec un objet
J'ai besoin de trouver les gestionnaires d'événements sont enregistrés sur un objet.
Par exemple:
$("#el").click(function() {...});
$("#el").mouseover(function() {...});
$("#el")
a cliquez sur et mouseover enregistré.
Est-il une fonction pour savoir qui, et éventuellement effectuer une itération sur les gestionnaires d'événements?
Si il n'est pas possible sur un objet jQuery par des méthodes appropriées, est-il possible sur un simple objet DOM?
- malheureusement, maintenant: bugs.jquery.com/ticket/10589
- soutien à la fois jQuery pré-et post-1.8:
var events = (jQuery._data || jQuery.data)(elem, 'events');
- Notez que vous pouvez utiliser la FF et Chrome dev-outils (F12) pour voir ces écouteurs d'événement. Voir developers.google.com/web/tools/chrome-devtools/debug/... et developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/...
Vous devez vous connecter pour publier un commentaire.
De jQuery 1.8, les données d'événement n'est plus disponible sur le public "API" pour les données. Lire cette jQuery post de blog. Vous devez maintenant utiliser ce lieu:
elem
devrait être un Élément HTML, pas un objet jQuery, ou le sélecteur.Veuillez noter, que ce soit à l'intérieur, "privé" de la structure, et ne devrait pas être modifié. L'utiliser pour des fins de débogage seulement.
Dans les anciennes versions de jQuery, vous pourriez avoir à utiliser l'ancienne méthode qui est:
$._data($(elem).get(0), "events")
handler: function () {
à l'intérieur de la propriété clic. J'ai eu de double-cliquer sur la fonction de la partie pour développer et afficher le contenu complet de la fonction.var events = (jQuery._data || jQuery.data)(elem, 'events');
function events(e) { $(e).each(function(){console.log(this);console.log($._data( this, "events" ));console.log("\n")}) }
Un rapide encore une fonction utileVous pouvez le faire par l'analyse des événements (comme de jQuery 1.8+), comme ceci:
Voici un exemple, vous pouvez jouer avec:
JS:
HTML:
jQuery._data( jQuery("#el")[0], "events" );
au lieu de "données publiques "méthode":jQuery("#el").data("events")
. Leevents
objet n'a pas été effectivement stockées dans.data()
pour une longue période, il est garni de quelques octets de code par la suppression de ce "proxy" à partir de "l'API"Pour jQuery 1.8+, ce ne sera plus de travail parce que les données interne est placé dans un objet différent.
La dernière officieux (mais fonctionne dans les versions précédentes ainsi, au moins en 1.7.2) façon de faire, c'est maintenant l' -
$._data(element, "events")
Le trait de soulignement ("_") est ce qui fait la différence ici. En interne, il est d'appeler
$.data(element, name, null, true)
, la dernière (quatrième) paramètre est l'une interne ("pvt").jQuery._data( element, "events" )
est la "bonne" manière d'obtenir cette information dans l'immédiat.Plug sans vergogne, mais vous pouvez utiliser findHandlerJS
Pour l'utiliser, il suffit d'inclure findHandlersJS (ou copiez simplement&collez le raw code javascript de chrome de la fenêtre de la console) 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é en faisant
C'est ce qui est retournée:
La réelle de l'élément sur lequel le gestionnaire d'événement a été enregistré dans
Un tableau avec les informations sur le jquery, des gestionnaires d'événement pour le type d'événement qui nous intéresse (par exemple, cliquez sur, changement, etc)
Réelle méthode de gestionnaire d'événement que vous pouvez voir en cliquant droit et en sélectionnant " Afficher la définition de la fonction de
Le sélecteur prévu pour les délégués des événements. Elle sera vide pour direct les événements.
Liste avec les éléments que ce gestionnaire d'événements cibles. Par exemple, pour un délégué du gestionnaire d'événement est enregistré dans le document de l'objet et des objectifs de tous les boutons sur une page, cette propriété aura la liste de tous les boutons de la page. Vous pouvez passer d'eux et de les voir mis en évidence dans google chrome.
Vous pouvez essayer ici
- Je utiliser eventbug plugin firebug pour ce but.
J'ai combiné les deux solutions de @jps à une seule fonction:
Mais attention, cette fonction ne peut retourner les événements qui ont été définies à l'aide de jQuery.
Que de 1,9 n'est pas documentée de manière à récupérer les événements, autres que l'utilisation de la Migrer plugin pour restaurer l'ancien comportement. Vous pouvez utiliser l' _.de données() la méthode que jps mentionne, mais c'est une méthode interne. Donc il suffit de faire la bonne chose et de l'utilisation de l'Migrer plugin si vous avez besoin de cette fonctionnalité.
De l'jQuery documentation sur
.de données("événements")
jQuery._data( elem, "events" );
....data("events")
de fonctionnalités, mais il a ses limites et sera plus à l'avenir.J'ai créé un custom sélecteur jQuery qui vérifie à la fois contre jQuery cache des gestionnaires d'événements ainsi que des éléments qui utilisent la méthode native pour les ajoutant:
Exemple:
Revenir les éléments qui ont un gestionnaire de clic attaché à eux.
Dans un navigateur moderne avec ECMAScript 5.1 /
Array.prototype.map
, vous pouvez également utiliserdans votre navigateur de la console, ce qui permet d'imprimer la source des gestionnaires, délimité par des virgules. Utile pour les jetant un coup d'oeil à ce que tout est en cours d'exécution sur un événement particulier.
jQuery._data('ct100_ContentPlaceHolder1_lcsSection','events')["EVENT_NAME"].map(function(elem){return elem.handler;});
Uncaught TypeError: Cannot read property 'EVENT_NAME' undefined at <anonyme>:1:62'ct100_ContentPlaceHolder1_lcsSection'
est une chaîne de caractères, pas un Élément du DOM.Pour vérifier les événements sur un élément:
Par exemple:
ou
Exemple Complet:
Façon plus complète à vérifier, qui comprend la dynamique des auditeurs, installé avec le $(document).sur
Exemple d'utilisation:
Je dois dire que beaucoup de réponses sont intéressantes, mais récemment, j'ai eu un problème similaire et la solution est extrêmement simple en allant les DOM façon. C'est différent parce que vous n'avez pas itérer mais visent directement à l'événement dont vous avez besoin, mais en dessous je vais vous donner une réponse générale.
J'ai eu une image en ligne:
Et que l'image avait un gestionnaire d'événements click relié:
Mon intention était d'étendre la zone cliquable à l'ensemble de la ligne, donc j'ai d'abord obtenu toutes les images et relative lignes:
Maintenant dans le réelle réponse ligne j'ai juste fait comme suit, en donnant une réponse à la question d'origine:
Donc je l'ai récupéré le gestionnaire d'événement directement à partir de l'élément du DOM et de le mettre dans le jQuery, cliquez sur gestionnaire d'événement. Fonctionne comme un charme.
Maintenant, pour le cas général. Dans l'ancien pré-jQuery jours, vous pouvez obtenir tous les événements associés à un objet avec deux simples, mais puissants, des fonctions doué pour nous, mortels, par Douglas Crockford:
Événements peuvent être récupérées à l'aide de:
ou jQuery 1.8+:
Remarque:
Les événements délimitée à l'aide de
$('selector').live('event', handler)
peuvent être récupérées en utilisant:
Essayer jquery débogueur plugin si vous utilisez google chrome: https://chrome.google.com/webstore/detail/jquery-debugger/dbhhnnnpaeobfddmlalhnehgclcmjimi?hl=en
Une autre façon de faire est de simplement utiliser jQuery pour saisir l'élément, puis passez par réelle Javascript pour obtenir et définir et de jouer avec les gestionnaires d'événements. Par exemple: