Existe-t-il un moyen de visualiser les fonctions/codes associés à un événement pour un élément DOM? Utiliser Firebug ou tout autre outil.
Les gestionnaires d’événements attachés à l’aide de la méthode traditionnelle element.onclick= handler
ou HTML <element onclick="handler">
peut être récupéré trivialement à partir du element.onclick
propriété du script ou du débogueur.
Les gestionnaires d'événements attachés à l'aide des méthodes DOM Level 2 Events addEventListener
et attachEvent
d'IE ne peuvent actuellement pas être récupérés à partir d'un script. DOM niveau 3 une fois proposé element.eventListenerList
pour obtenir tous les auditeurs, mais il n’est pas clair si cela aboutira à la spécification finale. Il n'y a aucune implémentation dans aucun navigateur aujourd'hui.
Un outil de débogage en tant qu'extension de navigateur pourrait accéder à ce type d'écouteurs, mais je ne suis au courant d'aucun de ceux-ci.
Certains frameworks JS laissent suffisamment d’événements de liaison d’événement pour savoir ce qu’ils ont fait. Visual Event adopte cette approche pour découvrir les écouteurs enregistrés via quelques frameworks populaires.
Le Elements Panel dans Google Chrome Outils de développement) l’a depuis Chrome est sorti mi-2011 et Chrome communiqués de la chaîne des développeurs depuis 2010.
De plus, les écouteurs d'événements affichés pour le nœud sélectionné sont dans l'ordre dans lequel ils sont déclenchés au cours des phases de capture et de propagation.
Frappé command + option + i sur Mac OSX et Ctrl + Shift + i sous Windows pour lancer ceci dans Chrome
Outils de développement Chrome ont récemment annoncé de nouveaux outils pour Contrôle des événements JavaScript .
TL; DR
Écoutez les événements d'un certain type en utilisant
monitorEvents()
.Utilisez
unmonitorEvents()
pour arrêter l'écoute.Obtenez les auditeurs d'un élément DOM en utilisant
getEventListeners()
.Utilisez le panneau de l'inspecteur Auditeurs d'événements pour obtenir des informations sur les écouteurs d'événements.
Recherche d'événements personnalisés
Pour mon besoin, la découverte d'événements JS personnalisés dans du code tiers, les deux versions suivantes de getEventListeners()
ont été incroyablement utiles;
getEventListeners(window)
getEventListeners(document)
Si vous savez quel type de DOM Node l'écouteur d'événements vous était associé) transmettriez cela au lieu de window
ou document
.
Evénement connu
Si vous savez quel événement vous souhaitez surveiller, par exemple click
sur 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 sur le document.body
en cours de connexion à la console.
Vous pouvez utiliser Visual Event par Allan Jardine pour inspecter tous les gestionnaires d’événements attachés à partir de plusieurs bibliothèques JavaScript importantes sur votre page. Cela fonctionne avec jQuery, YUI et plusieurs autres.
Visual Event est un bookmarklet JavaScript, il est donc compatible avec tous les principaux navigateurs.
Vous pouvez afficher directement les événements attachés (element.onclick = handler) en consultant le DOM. Vous pouvez afficher les événements liés à jQuery dans Firefox à l'aide de FireBug avec FireQuery. Il ne semble pas y avoir de moyen de voir les événements addEventListener ajoutés à l'aide de FireBug. Cependant, vous pouvez les voir dans Chrome en utilisant le débogueur Chrome.
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énements ajouté à partir de ce moment-là. Vous devez également étendre HTMLElement.prototype.removeEventListener pour conserver des enregistrements qui reflètent avec précision ce qui se passe dans le DOM.
Juste à titre d’illustration (code non testé) - c’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 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);
}