Я недавно работал с событиями и хотел просмотреть / контролировать все события на странице. Посмотрев на возможные решения, я решил пойти своим путем и создать собственную систему мониторинга событий. Итак, я сделал три вещи.
Во-первых, мне был нужен контейнер для всех прослушивателей событий на странице: это EventListenersобъект. Она состоит из трех полезных методов: add(), remove(), и get().
Затем я создал EventListenerобъект для хранения информации , необходимой для этого события, а именно: target, type, callback, options, useCapture, wantsUntrusted, и добавил метод remove()для удаления слушателя.
Наконец, я расширил native 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, он нуждается в дальнейшей модификации. Я мог бы исправить это в будущем.