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 EventListenersobjeto. Ele tem três métodos úteis: add(), remove()eget() .
Em seguida, eu criei um EventListenerobjeto 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 ( EventListenere EventListeners).
Uso:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()cria um EventListenerobjeto, adiciona EventListenerse retorna o EventListenerobjeto, para que possa ser removido mais tarde.
EventListeners.get()pode ser usado para visualizar os ouvintes na página. Ele aceita uma EventTargetou 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.