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()
, y get()
.
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étodo remove()
para eliminar el oyente.
Por último, extendí el nativo addEventListener()
y los removeEventListener()
métodos para que funcionen con los objetos que he creado ( EventListener
y EventListeners
).
Uso:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()
crea un EventListener
objeto, lo agrega EventListeners
y devuelve el EventListener
objeto, para que pueda eliminarse más tarde.
EventListeners.get()
se puede usar para ver a los oyentes en la página. Acepta una EventTarget
o una cadena (tipo de evento).
// EventListeners.get(document.body);
// EventListeners.get("click");
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:
// ==UserScript==
// @name New Userscript
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @include https://stackoverflow.com/*
// @grant none
// ==/UserScript==
(function() {
fetch("https://raw.githubusercontent.com/akinuri/js-lib/master/EventListener.js")
.then(function (response) {
return response.text();
})
.then(function (text) {
eval(text);
window.EventListeners = EventListeners;
});
})(window);
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
function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}
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:
$(document.body).click(function () {
console.log("jquery click");
});
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.