Tengo una página donde algunos oyentes de eventos están conectados a cuadros de entrada y cuadros de selección. ¿Hay alguna manera de averiguar qué oyentes de eventos están observando un nodo DOM particular y para qué evento?
Los eventos se adjuntan utilizando:
- Prototipos
Event.observe
; - DOM's
addEventListener
; - Como atributo del elemento
element.onclick
.
javascript
events
dom
Navneet
fuente
fuente
element.addEventListener(type, callback, [bubble])
, mientras queelement.onclick = function
se sobrescribirán cada vez que asigne.Respuestas:
Si solo necesita inspeccionar lo que sucede en una página, puede probar el bookmarklet Visual Event .
Actualización : Visual Event 2 disponible.
fuente
EventBug
complemento de Firebug .Depende de cómo se adjuntan los eventos. Por ejemplo, supongamos que tenemos el siguiente controlador de clics:
Vamos a adjuntarlo a nuestro elemento utilizando diferentes métodos, algunos que permiten la inspección y otros que no.
Método A) controlador de evento único
Método B) controladores de eventos múltiples
Método C): jQuery
1.3.x
1.4.x (almacena el controlador dentro de un objeto)
(Ver
jQuery.fn.data
yjQuery.data
)Método D): prototipo (desordenado)
1.5.x
1.6 a 1.6.0.3, inclusive (se hizo muy difícil aquí)
1.6.1 (un poco mejor)
fuente
addEventListener
?.data('events')
como antes. Para acceder a los datos de eventos internos, use$._data(elem, 'events')
. Tenga en cuenta que esta función está marcada "solo para uso interno" en la fuente jQuery, por lo que no promete que siempre funcionará en el futuro, pero creo que ha funcionado desde jQuery 1.7 y aún funciona.Chrome, Firefox, Vivaldi y Safari son compatibles
getEventListeners(domElement)
con su consola de herramientas de desarrollador.Para la mayoría de los propósitos de depuración, esto podría usarse.
A continuación hay una muy buena referencia para usarlo: https://developers.google.com/web/tools/chrome-devtools/console/utilities#geteventlisteners
fuente
getEventListeners(object)
obj getEventListeners()
var list = getEventListeners(document.getElementById("YOURIDHERE")); console.log(list["focus"][0]["listener"].toString())
. Cambie "foco" al evento que desea inspeccionar y al número si hay varios oyentes en el mismo evento.getEventListeners($0)
obtendrá los oyentes de eventos para el elemento en el que se ha centrado en las herramientas de desarrollo de Chrome. Uso esto todo el tiempo. Me encanta no tener que usar querySelector o get__By_ funcionesWebKit Inspector en los navegadores Chrome o Safari ahora hace esto. Mostrará los detectores de eventos para un elemento DOM cuando lo seleccione en el panel Elementos.
fuente
Es posible enumerar todos los oyentes de eventos en JavaScript: no es tan difícil; solo tiene que hackear el
prototype
método de los elementos HTML ( antes de agregar los oyentes).Ahora cada elemento de anclaje (
a
) tendrá unalastListenerInfo
propiedad que contiene a todos sus oyentes. E incluso funciona para eliminar oyentes con funciones anónimas.fuente
Node.prototype
lugar? Ahí es dondeHTMLAnchorElement
hereda.addEventListener
de todos modos.Use getEventListeners en Google Chrome :
fuente
(Reescribiendo la respuesta de esta pregunta ya que es relevante aquí).
Al depurar, si solo desea ver los eventos, le recomiendo ...
Si desea usar los eventos en su código y está usando jQuery antes de la versión 1.8 , puede usar:
para obtener los eventos. A partir de la versión 1.8, se descontinúa el uso de .data ("eventos") (consulte este ticket de error ). Puedes usar:
Otro ejemplo: escriba todos los eventos de clic en un determinado enlace a la consola:
(Ver http://jsfiddle.net/HmsQC/ para un ejemplo de trabajo)
Desafortunadamente, el uso de $ ._ data no se recomienda, excepto para la depuración, ya que es una estructura interna de jQuery y podría cambiar en futuras versiones. Lamentablemente, no conozco ningún otro medio fácil para acceder a los eventos.
fuente
$._data(elem, "events")
no parece funcionar con jQuery 1.10, al menos para eventos registrados usando$(elem).on('event', ...)
. ¿Alguien sabe cómo depurarlos?$._data
puede ser un elemento y no un objeto jQuery. Así que necesito arreglar mi ejemplo anterior para serconsole.log($._data($myLink[0], "events").click);
1:
Prototype.observe
utiliza Element.addEventListener (ver el código fuente )2: Puede anular
Element.addEventListener
para recordar los oyentes agregados (EventListenerList
se eliminó la propiedad práctica de la propuesta de especificación DOM3). Ejecute este código antes de adjuntar cualquier evento:Lea todos los eventos por:
Y no olvide anular
Element.removeEventListener
para eliminar el evento de la costumbreElement.eventListenerList
.3: la
Element.onclick
propiedad necesita cuidados especiales aquí:4: no olvide el
Element.onclick
atributo de contenido: estas son dos cosas diferentes:Así que también debes manejarlo:
El marcador de evento visual (mencionado en la respuesta más popular) solo roba el caché del controlador de la biblioteca personalizada:
La anulación de elementos puede ser cuestionable (es decir, porque hay algunas características específicas del DOM, como colecciones en vivo, que no se pueden codificar en JS), pero le da soporte al eventListenerList de forma nativa y funciona en Chrome, Firefox y Opera (no funciona en IE7 )
fuente
Puede ajustar los métodos DOM nativos para administrar oyentes de eventos colocando esto en la parte superior de su
<head>
:H / T @ les2
fuente
Las herramientas para desarrolladores de Firefox ahora hacen esto. Los eventos se muestran haciendo clic en el botón "ev" a la derecha de la pantalla de cada elemento, incluidos los eventos jQuery y DOM .
fuente
Si tiene Firebug , puede usarlo
console.dir(object or array)
para imprimir un árbol agradable en el registro de la consola de cualquier escalar, matriz u objeto de JavaScript.Tratar:
o
fuente
Solución totalmente funcional basada en la respuesta de Jan Turon : se comporta como
getEventListeners()
desde la consola:(Hay un pequeño error con duplicados. De todos modos, no se rompe mucho).
Uso:
someElement.getEventListeners([name])
- lista de retorno de oyentes de eventos, si se establece el nombre, devuelve la matriz de oyentes para ese eventosomeElement.clearEventListeners([name])
- eliminar todos los oyentes de eventos, si el nombre está configurado solo eliminar oyentes para ese eventofuente
body
ydocument
.Opera 12 (no es el último motor Chrome Webkit basado) Dragonfly ha tenido esto por un tiempo y obviamente se muestra en la estructura DOM. En mi opinión, es un depurador superior y es la única razón por la que sigo usando la versión basada en Opera 12 (no hay una versión v13, v14 y el v15 Webkit todavía carece de Dragonfly)
fuente
Prototipo 1.7.1 camino
fuente
Recientemente estuve trabajando con eventos y quería ver / controlar todos los eventos en una página. Después de buscar posibles soluciones, decidí seguir mi propio camino y crear un sistema personalizado para monitorear eventos. Entonces, hice tres cosas.
Primero, necesitaba un contenedor para todos los oyentes de eventos en la página: ese es el
EventListeners
objeto. Tiene tres métodos útiles:add()
,remove()
, yget()
.A continuación, crea un
EventListener
objeto para mantener la información necesaria para el evento, es decir:target
,type
,callback
,options
,useCapture
,wantsUntrusted
, y añade un métodoremove()
para eliminar el oyente.Por último, extendí el nativo
addEventListener()
y losremoveEventListener()
métodos para que funcionen con los objetos que he creado (EventListener
yEventListeners
).Uso:
addEventListener()
crea unEventListener
objeto, lo agregaEventListeners
y devuelve elEventListener
objeto, para que pueda eliminarse más tarde.EventListeners.get()
se puede usar para ver a los oyentes en la página. Acepta unaEventTarget
o una cadena (tipo de evento).Manifestación
Digamos que queremos conocer a todos los oyentes de eventos en esta página actual. Podemos hacer eso (suponiendo que esté utilizando una extensión del administrador de scripts, Tampermonkey en este caso). El siguiente script hace esto:
Y cuando enumeramos todos los oyentes, dice que hay 299 oyentes de eventos. "Parece" que hay algunos duplicados, pero no sé si realmente son duplicados. No todos los tipos de eventos están duplicados, por lo que todos esos "duplicados" pueden ser un oyente individual.
El código se puede encontrar en mi repositorio. No quería publicarlo aquí porque es bastante largo.
Actualización: Esto no parece funcionar con jQuery. Cuando examino EventListener, veo que la devolución de llamada es
Creo que esto pertenece a jQuery, y no es la devolución de llamada real. jQuery almacena la devolución de llamada real en las propiedades de EventTarget:
Para eliminar un detector de eventos, la devolución de llamada real debe pasarse al
removeEventListener()
método. Entonces, para que esto funcione con jQuery, necesita más modificaciones. Podría arreglar eso en el futuro.fuente
Estoy tratando de hacer eso en jQuery 2.1, y con el
$().click() -> $(element).data("events").click;
método " " no funciona.Me di cuenta de que solo las funciones $ ._ data () funcionan en mi caso:
fuente
Existe una buena extensión de jQuery Events :
( fuente del tema )
fuente
cambiar estas funciones le permitirá registrar los oyentes agregados:
leer al resto de los oyentes con
fuente