Recentemente, eu estava trabalhando com eventos e queria exibir / controlar todos os eventos em uma página. Tendo analisado as possíveis soluções, decidi seguir meu próprio caminho e criar um sistema personalizado para monitorar eventos. Então, eu fiz três coisas.
Primeiro, eu precisava de um contêiner para todos os ouvintes de eventos na página: esse é o EventListeners
objeto. Ele tem três métodos úteis: add()
, remove()
eget()
.
Em seguida, eu criei um EventListener
objeto para armazenar as informações necessárias para o evento, ou seja: target
, type
, callback
, options
, useCapture
, wantsUntrusted
, e acrescentou um métodoremove()
para remover o ouvinte.
Por fim, estendi os métodos nativo addEventListener()
e removeEventListener()
para fazê-los funcionar com os objetos que criei ( EventListener
e EventListeners
).
Uso:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()
cria um EventListener
objeto, adiciona EventListeners
e retorna o EventListener
objeto, para que possa ser removido mais tarde.
EventListeners.get()
pode ser usado para visualizar os ouvintes na página. Ele aceita uma EventTarget
ou uma sequência (tipo de evento).
// EventListeners.get(document.body);
// EventListeners.get("click");
Demo
Digamos que queremos conhecer todos os ouvintes de eventos nesta página atual. Podemos fazer isso (supondo que você esteja usando uma extensão do gerenciador de scripts, Tampermonkey neste caso). O script a seguir faz isso:
// ==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);
E quando listamos todos os ouvintes, ele diz que existem 299 ouvintes de eventos. "Parece" que existem algumas duplicatas, mas não sei se são realmente duplicatas. Nem todo tipo de evento é duplicado; portanto, todos esses "duplicados" podem ser um ouvinte individual.
Código pode ser encontrado no meu repositório. Eu não queria publicá-lo aqui, porque é bastante longo.
Atualização: parece não funcionar com o jQuery. Quando examino o EventListener, vejo que o retorno de chamada é
function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}
Eu acredito que isso pertence ao jQuery e não é o retorno de chamada real. O jQuery armazena o retorno de chamada real nas propriedades do EventTarget:
$(document.body).click(function () {
console.log("jquery click");
});
Para remover um ouvinte de evento, o retorno de chamada real precisa ser passado para o removeEventListener()
método Portanto, para fazer isso funcionar com o jQuery, ele precisa de mais modificações. Eu posso consertar isso no futuro.