Inspectez les gestionnaires d'événements attachés pour tout élément DOM

107

Existe-t-il un moyen de voir quelles fonctions / codes sont attachés à un événement pour un élément DOM? Utilisation de Firebug ou de tout autre outil.

Claudio Redi
la source
Attaché en utilisant jQuery ou en utilisant DOM natif?
SLaks
3
@SLaks: Bonne question. Attaché en utilisant N'IMPORTE QUEL mécanisme
Claudio Redi

Réponses:

71

Les gestionnaires d'événements attachés en utilisant traditionnel element.onclick= handlerou HTML <element onclick="handler">peuvent être extraits de manière simple de la element.onclickpropriété à partir d'un script ou d'un débogueur.

Les gestionnaires d'événements attachés à l'aide des addEventListenerméthodes d' événements DOM de niveau 2 et d'IE attachEventne peuvent actuellement pas être récupérés à partir du script. DOM Level 3 proposait une fois element.eventListenerListd'obtenir tous les écouteurs, mais il n'est pas clair si cela atteindra la spécification finale. Il n'y a aujourd'hui aucune implémentation dans aucun navigateur.

Un outil de débogage en tant qu'extension de navigateur pourrait avoir accès à ce type d'écouteurs, mais je n'en connais pas.

Certains frameworks JS laissent un enregistrement suffisant de la liaison d'événements pour déterminer ce qu'ils ont fait. Visual Event adopte cette approche pour découvrir les écouteurs enregistrés via quelques frameworks populaires.

bobince
la source
7
Il existe maintenant une extension pour Firebug appelée EventBug et qui aurait une fonctionnalité similaire dans chrome / safari. Je vais également
créer
1
Dans Opera, vous pouvez utiliser Opera Dragonfly intégré pour cela.
Norill Tempest
Il existe également une partie intégrée à FireBug (Extension for FireFox) pour les événements lorsque la balise HTML est sélectionnée.
Musa Haidari
EventBug est intégré à FireBug depuis la version 2 (il y a maintenant un onglet "Événements").
Chris Rae
76

Le panneau Elements dans les outils de développement de Google Chrome a cela depuis les versions de Chrome à la mi-2011 et les versions de canal de développement Chrome depuis 2010.

En outre, les écouteurs d'événements affichés pour le nœud sélectionné sont dans l'ordre dans lequel ils sont déclenchés pendant les phases de capture et de bullage.

Appuyez sur command+ option+ isur Mac OSX et Ctrl+ Shift+ isur Windows pour activer ceci dans Chrome

capture d'écran des outils de développement

Tuxtitlan
la source
5
Comment le panneau des éléments dans Chrome fait-il cela?
thunderboltz
1
Aussi, comment pouvons-nous trouver le code qui les attribue? Une fois que je trouve un gestionnaire d'événements suspect utilisant cette interface utilisateur, la barre n'est pas assez large pour que je puisse voir le code du gestionnaire ...
Steven Lu
Je trouve cette approche plutôt déroutante .. du moins pour moi. Lorsque j'ai ouvert l'événement, il ne contient que des événements jQuery, mon événement personnalisé pour cet élément particulier ne s'affiche pas. J'utilise des données $ ._ pour les événements personnalisés que j'attache avec jQuery. Voir stackoverflow.com/questions/2008592/…
stack247
2
Est-il possible d'inspecter les événements sur l' windowobjet, comme l' messageévénement?
Septagram
8

Chrome Dev Tools a récemment annoncé de nouveaux outils pour la surveillance des événements JavaScript .

TL; DR

Écoutez les événements d'un certain type à l'aide de monitorEvents().

Utilisez unmonitorEvents()pour arrêter d'écouter.

Obtenez les écouteurs d'un élément DOM en utilisant getEventListeners().

Utilisez le panneau Inspecteur des écouteurs d'événements pour obtenir des informations sur les écouteurs d'événements.

Recherche d'événements personnalisés

Pour mon besoin, en découvrant des événements JS personnalisés dans du code tiers, les deux versions suivantes du getEventListeners()ont été incroyablement utiles;

  • getEventListeners(window)
  • getEventListeners(document)

Si vous savez à quel nœud DOM l'écouteur d'événements était attaché, vous le transmettriez au lieu de windowou document.

Événement connu

Si vous savez quel événement vous souhaitez surveiller, par exemple clicksur le corps du document, vous pouvez utiliser ce qui suit:monitorEvents(document.body, 'click'); .

Vous devriez maintenant commencer à voir tous les événements de clic lors de la document.bodyconnexion dans la console.

GFargo
la source
J'ai essayé thisgetEventListeners (document.getElementById ("inputId")); mais il retourne invalide, avec une taille de tableau de 1
vert riche
6

Vous pouvez afficher les événements directement attachés (element.onclick = handler) en regardant le DOM. Vous pouvez afficher les événements attachés à jQuery dans Firefox en utilisant FireBug avec FireQuery. Il ne semble pas y avoir de moyen de voir les événements ajoutés à addEventListener à l'aide de FireBug. Cependant, vous pouvez les voir dans Chrome à l'aide du débogueur Chrome.

mhenry1384
la source
6

Vous pouvez utiliser Visual Event par Allan Jardine pour inspecter tous les gestionnaires d'événements actuellement attachés à partir de plusieurs bibliothèques JavaScript majeures sur votre page. Cela fonctionne avec jQuery, YUI et plusieurs autres.

Visual Event est un bookmarklet JavaScript donc compatible avec tous les principaux navigateurs.

Medlock Perlman
la source
1

Vous pouvez étendre votre environnement javascript pour garder une trace des écouteurs d'événements. Enveloppez (ou 'surchargez') la méthode native addEventListener () avec du code qui peut conserver un enregistrement de tout écouteur d'événement ajouté à partir de là . Vous devrez également étendre HTMLElement.prototype.removeEventListener pour conserver des enregistrements reflétant précisément ce qui se passe dans le DOM.

Juste à titre d'illustration (code non testé) - ceci est un exemple de la façon dont vous `` encapsuleriez '' addEventListener pour avoir des enregistrements des écouteurs d'événements enregistrés sur l'objet lui-même:

var nativeMethod = HTMLElement.prototype.addEventListener;
HTMLElement.prototype.addEventListener = function (type, listener) {
   var el = e.currentTarget;
   if(!(el.eventListeners instanceof Array)) { el.eventListeners = []}
   el.eventListeners.push({'type':type, 'listener':listener});
   nativeMethod.call(el, type, listener);
}
Rolf
la source