Inspeccione los controladores de eventos adjuntos para cualquier elemento DOM

107

¿Hay alguna forma de ver qué funciones / código se adjuntan a cualquier evento para un elemento DOM? Usando Firebug o cualquier otra herramienta.

Claudio Redi
fuente
¿Adjunto usando jQuery o usando DOM nativo?
SLaks
3
@SLaks: Buena pregunta. Adjunto usando CUALQUIER mecanismo
Claudio Redi

Respuestas:

71

Los controladores de eventos adjuntos mediante element.onclick= handlerHTML o tradicional <element onclick="handler">se pueden recuperar de forma trivial desde la element.onclickpropiedad desde el script o en el depurador.

Los controladores de eventos adjuntos mediante los addEventListenermétodos de eventos DOM Nivel 2 e IE attachEventno se pueden recuperar actualmente del script. DOM Level 3 una vez propuso element.eventListenerListobtener todos los oyentes, pero no está claro si esto llegará a la especificación final. Actualmente, no hay implementación en ningún navegador.

Una herramienta de depuración como extensión del navegador podría tener acceso a este tipo de oyentes, pero no conozco ninguno que realmente lo haga.

Algunos frameworks JS dejan suficiente registro de enlace de eventos para averiguar lo que han estado haciendo. Visual Event adopta este enfoque para descubrir oyentes registrados a través de algunos marcos populares.

bobince
fuente
7
Ahora hay una extensión para Firebug llamada EventBug y, según se informa, una característica similar en Chrome / Safari. También lo vincularé a una discusión más popular sobre esto: stackoverflow.com/questions/446892/…
Nickolay
1
En Opera puedes usar Opera Dragonfly incorporado para eso.
Norill Tempest
También hay una parte incorporada a FireBug (Extensión para FireFox) para eventos cuando se selecciona la etiqueta HTML.
Musa Haidari
EventBug está integrado en FireBug desde la versión 2 (ahora hay una pestaña "Eventos").
Chris Rae
76

El Panel de elementos en las herramientas para desarrolladores de Google Chrome ha tenido esto desde los lanzamientos de Chrome a mediados de 2011 y los lanzamientos del canal de desarrolladores de Chrome desde 2010.

Además, los detectores de eventos que se muestran para el nodo seleccionado están en el orden en que se activan a través de las fases de captura y propagación.

Presione command+ option+ ien Mac OSX y Ctrl+ Shift+ ien Windows para iniciar esto en Chrome

captura de pantalla de herramientas de desarrollo

tuxtitlán
fuente
5
¿Cómo hace esto el panel de elementos en Chrome?
Thunderboltz
1
Además, ¿cómo podemos encontrar el código que las asigna? Una vez que encuentro un controlador de eventos sospechoso usando esta interfaz de usuario, la barra no es lo suficientemente ancha como para ver el código del controlador ...
Steven Lu
Encuentro este enfoque bastante confuso ... al menos para mí. Cuando abrí el evento, solo tiene eventos jQuery, mi evento personalizado para ese elemento en particular no se muestra. Utilizo $ ._ data para eventos personalizados que adjunto con jQuery. Ver stackoverflow.com/questions/2008592/…
stack247
2
¿Es posible inspeccionar los eventos en el windowobjeto, como el messageevento?
Septagrama
8

Chrome Dev Tools anunció recientemente algunas herramientas nuevas para monitorear eventos de JavaScript .

TL; DR

Escuche eventos de cierto tipo usando monitorEvents().

Úselo unmonitorEvents()para dejar de escuchar.

Obtenga oyentes de un elemento DOM usando getEventListeners().

Utilice el panel Inspector de oyentes de eventos para obtener información sobre los oyentes de eventos.

Encontrar eventos personalizados

Para mi necesidad, al descubrir eventos JS personalizados en código de terceros, las siguientes dos versiones getEventListeners()fueron increíblemente útiles;

  • getEventListeners(window)
  • getEventListeners(document)

Si sabe a qué nodo DOM se adjuntó el detector de eventos, lo pasaría en lugar de windowo document.

Evento conocido

Si usted sabe qué evento que desea supervisar, por ejemplo clicken el cuerpo del documento se puede utilizar el siguiente: monitorEvents(document.body, 'click');.

Ahora debería comenzar a ver todos los eventos de clic en el document.bodyregistro en la consola.

GFargo
fuente
He probado thisgetEventListeners (document.getElementById ("inputId")); pero devuelve no válido, con un tamaño de matriz de 1
verde
6

Puede ver los eventos adjuntos directamente (element.onclick = handler) mirando el DOM. Puede ver los eventos adjuntos de jQuery en Firefox usando FireBug con FireQuery. No parece haber ninguna forma de ver los eventos agregados de addEventListener usando FireBug. Sin embargo, puede verlos en Chrome usando el depurador de Chrome.

mhenry1384
fuente
6

Puede utilizar Visual Event de Allan Jardine para inspeccionar todos los controladores de eventos adjuntos actualmente de varias de las principales bibliotecas de JavaScript de su página. Funciona con jQuery, YUI y varios otros.

Visual Event es un marcador de JavaScript, por lo que es compatible con los principales navegadores.

Medlock Perlman
fuente
1

Puede ampliar su entorno javascript para realizar un seguimiento de los oyentes de eventos. Envuelva (o 'sobrecargue') el método nativo addEventListener () con algún código que pueda mantener un registro de cualquier detector de eventos agregado a partir de ese momento . También tendría que extender HTMLElement.prototype.removeEventListener para mantener registros que reflejen con precisión lo que está sucediendo en el DOM.

Solo por el bien de la ilustración (código no probado): este es un ejemplo de cómo 'envolvería' addEventListener para tener registros de los oyentes de eventos registrados en el propio objeto:

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
fuente