J'ai une page où certains écouteurs d'événements sont attachés aux zones de saisie et aux zones de sélection. Existe-t-il un moyen de savoir quels écouteurs d'événements observent un nœud DOM particulier et pour quel événement?
Les événements sont attachés en utilisant:
- Prototype
Event.observe
; - DOM
addEventListener
; - Comme attribut d'élément
element.onclick
.
javascript
events
dom
Navneet
la source
la source
element.addEventListener(type, callback, [bubble])
, tandiselement.onclick = function
qu'elles seront écrasées chaque fois que vous les affecterez.Réponses:
Si vous avez juste besoin d'inspecter ce qui se passe sur une page, vous pouvez essayer le bookmarklet Visual Event .
Mise à jour : Visual Event 2 disponible.
la source
EventBug
plugin Beats Firebug .Cela dépend de la façon dont les événements sont attachés. Pour l'illustration, supposons que nous avons le gestionnaire de clics suivant:
Nous allons l'attacher à notre élément en utilisant différentes méthodes, certaines qui permettent l'inspection et d'autres qui ne le permettent pas.
Méthode A) gestionnaire d'événements unique
Méthode B) plusieurs gestionnaires d'événements
Méthode C): jQuery
1.3.x
1.4.x (stocke le gestionnaire dans un objet)
(Voir
jQuery.fn.data
etjQuery.data
)Méthode D): Prototype (désordonné)
1.5.x
1.6 à 1.6.0.3, inclus (est devenu très difficile ici)
1.6.1 (peu mieux)
la source
addEventListener
?.data('events')
comme auparavant. Pour accéder aux données d'événement internes, utilisez$._data(elem, 'events')
. Notez que cette fonction est marquée "pour usage interne uniquement" dans la source jQuery, donc aucune promesse qu'elle fonctionnera toujours à l'avenir, mais je crois qu'elle fonctionne depuis jQuery 1.7 et fonctionne toujours.Prise
getEventListeners(domElement)
en charge de Chrome, Firefox, Vivaldi et Safari dans leur console Developer Tools.Pour la majorité des objectifs de débogage, cela pourrait être utilisé.
Ci-dessous, une très bonne référence pour l'utiliser: https://developers.google.com/web/tools/chrome-devtools/console/utilities#geteventlisteners
la source
getEventListeners(object)
obj getEventListeners()
var list = getEventListeners(document.getElementById("YOURIDHERE")); console.log(list["focus"][0]["listener"].toString())
. Remplacez «focus» par l'événement que vous souhaitez inspecter et le nombre s'il y a plusieurs écouteurs sur le même événement.getEventListeners($0)
obtiendra les écouteurs d'événements pour l'élément sur lequel vous vous êtes concentré dans les outils de développement Chrome. Je l'utilise tout le temps. J'adore ne pas avoir à utiliser les fonctions querySelector ou get__By_WebKit Inspector dans les navigateurs Chrome ou Safari le fait désormais. Il affichera les écouteurs d'événements pour un élément DOM lorsque vous le sélectionnez dans le volet Éléments.
la source
Il est possible de lister tous les écouteurs d'événements en JavaScript: ce n'est pas si difficile; il vous suffit de pirater la
prototype
méthode des éléments HTML ( avant d' ajouter les écouteurs).Désormais, chaque élément d'ancrage (
a
) aura unelastListenerInfo
propriété qui contient tous ses écouteurs. Et cela fonctionne même pour supprimer les écouteurs avec des fonctions anonymes.la source
Node.prototype
place? C'est de là queHTMLAnchorElement
hérite.addEventListener
de toute façon.Utilisez getEventListeners dans Google Chrome :
la source
(Réécriture de la réponse à cette question car elle est pertinente ici.)
Lors du débogage, si vous voulez juste voir les événements, je vous recommande soit ...
Si vous souhaitez utiliser les événements dans votre code et que vous utilisez jQuery avant la version 1.8 , vous pouvez utiliser:
pour obtenir les événements. Depuis la version 1.8, l'utilisation de .data ("événements") est arrêtée (voir ce ticket de bogue ). Vous pouvez utiliser:
Un autre exemple: Écrivez tous les événements de clic sur un certain lien vers la console:
(voir http://jsfiddle.net/HmsQC/ pour un exemple de travail)
Malheureusement, l' utilisation de données $ ._ n'est pas recommandée, sauf pour le débogage, car il s'agit d'une structure jQuery interne et pourrait changer dans les versions futures. Malheureusement, je ne connais aucun autre moyen facile d'accéder aux événements.
la source
$._data(elem, "events")
ne semble pas fonctionner avec jQuery 1.10, du moins pour les événements enregistrés avec$(elem).on('event', ...)
. Quelqu'un sait-il comment les déboguer?$._data
doit être un élément et non un objet jQuery. Je dois donc corriger mon exemple ci-dessus pour êtreconsole.log($._data($myLink[0], "events").click);
1:
Prototype.observe
utilise Element.addEventListener (voir le code source )2: Vous pouvez remplacer
Element.addEventListener
pour vous souvenir des écouteurs ajoutés (la propriété pratique aEventListenerList
été supprimée de la proposition de spécification DOM3). Exécutez ce code avant de rattacher un événement:Lisez tous les événements par:
Et n'oubliez pas de remplacer
Element.removeEventListener
pour supprimer l'événement de la coutumeElement.eventListenerList
.3: la
Element.onclick
propriété a besoin d'un soin particulier ici:4: n'oubliez pas l'
Element.onclick
attribut content: ce sont deux choses différentes:Vous devez donc aussi le gérer:
Le bookmarklet Visual Event (mentionné dans la réponse la plus populaire) ne vole que le cache du gestionnaire de bibliothèque personnalisé:
La substitution d'éléments peut être discutable (c'est-à-dire parce qu'il existe certaines fonctionnalités spécifiques au DOM comme les collections en direct, qui ne peuvent pas être codées dans JS), mais cela donne le support eventListenerList en natif et cela fonctionne dans Chrome, Firefox et Opera (ne fonctionne pas dans IE7 ).
la source
Vous pouvez encapsuler les méthodes natives DOM pour gérer les écouteurs d'événements en les plaçant en haut de votre
<head>
:H / T @ les2
la source
Les outils de développement de Firefox le font maintenant. Les événements sont affichés en cliquant sur le bouton "ev" à droite de l'affichage de chaque élément, y compris les événements jQuery et DOM .
la source
Si vous avez Firebug , vous pouvez utiliser
console.dir(object or array)
pour imprimer une belle arborescence dans le journal de la console de tout scalaire, tableau ou objet JavaScript.Essayer:
ou
la source
Solution entièrement fonctionnelle basée sur la réponse de Jan Turon - se comporte comme à
getEventListeners()
partir de la console:(Il y a un petit bug avec les doublons. Il ne casse pas grand-chose de toute façon.)
Usage:
someElement.getEventListeners([name])
- retourne la liste des écouteurs d'événement, si le nom est défini, retourne un tableau d'écouteurs pour cet événementsomeElement.clearEventListeners([name])
- supprimer tous les écouteurs d'événements, si le nom est défini, supprimer uniquement les écouteurs de cet événementla source
body
etdocument
.Opera 12 (pas le dernier moteur Chrome Webkit) Dragonfly a cela depuis un certain temps et est évidemment affiché dans la structure DOM. À mon avis, c'est un débogueur supérieur et c'est la seule raison qui reste pour laquelle j'utilise toujours la version basée sur Opera 12 (il n'y a pas de version v13, v14 et la version v15 Webkit n'a toujours pas Dragonfly)
la source
Prototype 1.7.1 façon
la source
Je travaillais récemment avec des événements et je voulais voir / contrôler tous les événements dans une page. Après avoir examiné les solutions possibles, j'ai décidé de suivre ma propre voie et de créer un système personnalisé pour surveiller les événements. J'ai donc fait trois choses.
Tout d'abord, j'avais besoin d'un conteneur pour tous les écouteurs d'événements de la page: c'est l'
EventListeners
objet. Il dispose de trois méthodes utiles:add()
,remove()
etget()
.Ensuite, je créé un
EventListener
objet de tenir les informations nécessaires à l'événement, à savoir:target
,type
,callback
,options
,useCapture
,wantsUntrusted
, et a ajouté une méthoderemove()
pour supprimer l'auditeur.Enfin, j'ai étendu le natif
addEventListener()
et lesremoveEventListener()
méthodes pour les faire fonctionner avec les objets que j'ai créés (EventListener
etEventListeners
).Usage:
addEventListener()
crée unEventListener
objet, l'ajouteEventListeners
et le renvoieEventListener
, afin qu'il puisse être supprimé ultérieurement.EventListeners.get()
peut être utilisé pour afficher les écouteurs dans la page. Il accepte unEventTarget
ou une chaîne (type d'événement).Démo
Disons que nous voulons connaître tous les écouteurs d'événements dans cette page actuelle. Nous pouvons le faire (en supposant que vous utilisez une extension de gestionnaire de scripts, Tampermonkey dans ce cas). Le script suivant fait ceci:
Et quand nous listons tous les auditeurs, il est dit qu'il y a 299 auditeurs d'événements. Il semble qu'il y ait des doublons, mais je ne sais pas s'ils sont vraiment des doublons. Tous les types d'événements ne sont pas dupliqués, tous ces «doublons» peuvent donc être un écouteur individuel.
Le code peut être trouvé dans mon référentiel. Je ne voulais pas le poster ici car c'est assez long.
Mise à jour: cela ne semble pas fonctionner avec jQuery. Lorsque j'examine l'EventListener, je vois que le rappel est
Je crois que cela appartient à jQuery et n'est pas le rappel réel. jQuery stocke le rappel réel dans les propriétés de EventTarget:
Pour supprimer un écouteur d'événements, le rappel réel doit être transmis à la
removeEventListener()
méthode. Donc, pour que cela fonctionne avec jQuery, il doit être modifié davantage. Je pourrais résoudre ce problème à l'avenir.la source
J'essaie de le faire dans jQuery 2.1, et avec la
$().click() -> $(element).data("events").click;
méthode " " cela ne fonctionne pas.J'ai réalisé que seules les fonctions $ ._ data () fonctionnent dans mon cas:
la source
Il existe une belle extension jQuery Events :
( source du sujet )
la source
la modification de ces fonctions vous permettra de connecter les écouteurs ajoutés:
lire le reste des auditeurs avec
la source