Я нещодавно працював з подіями і хотів переглянути / контролювати всі події на сторінці. Переглянувши можливі рішення, я вирішив піти власним шляхом і створити власну систему для моніторингу подій. Отже, я зробив три речі.
По-перше, мені знадобився контейнер для всіх слухачів подій на сторінці: це EventListenersоб’єкт. Вона складається з трьох корисних методів: add(), remove(), і get().
Потім я створив EventListenerоб'єкт для зберігання необхідної інформації для події, тобто target, type, callback, options, useCapture,wantsUntrusted , і додав метод remove()для видалення слухача.
Нарешті, я розширив нативні addEventListener()і removeEventListener()методи, щоб змусити їх працювати з створеними мною об'єктами ( EventListenerіEventListeners ) .
Використання:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()створює EventListenerоб’єкт, додає його EventListenersі повертає EventListenerоб'єкт, щоб його можна було потім видалити.
EventListeners.get()можна використовувати для перегляду слухачів на сторінці. Він приймає EventTargetабо рядок (тип події).
// EventListeners.get(document.body);
// EventListeners.get("click");
Демо
Скажімо, ми хочемо знати кожного слухача події на цій поточній сторінці. Ми можемо це зробити (припустимо, що ви використовуєте розширення менеджера сценаріїв, у цьому випадку Tampermonkey). Наступний сценарій робить це:
// ==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);
І коли ми перераховуємо всіх слухачів, він говорить, що є 299 слухачів подій. Там, здається, є кілька дублікатів, але я не знаю, чи справді це дублікати. Не кожен тип події дублюється, тому всі ці "дублікати" можуть бути окремими слухачами.

Код можна знайти в моєму сховищі. Я не хотів публікувати його тут, тому що це досить довго.
Оновлення: Схоже, це не працює з jQuery. Переглядаючи EventListener, я бачу, що зворотний виклик є
function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}
Я вважаю, що це належить до jQuery, а не є фактичним зворотним дзвоном. jQuery зберігає фактичний зворотний виклик у властивостях EventTarget:
$(document.body).click(function () {
console.log("jquery click");
});

Щоб видалити слухача подій, фактичний зворотний виклик потрібно передати removeEventListener()методу. Отже, щоб зробити цю роботу з jQuery, вона потребує подальшої модифікації. Я можу це виправити в майбутньому.