Я недавно работал с событиями и хотел просмотреть / контролировать все события на странице. Посмотрев на возможные решения, я решил пойти своим путем и создать собственную систему мониторинга событий. Итак, я сделал три вещи.
Во-первых, мне нужен контейнер для всех прослушивателей событий на странице: это объект 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, он нуждается в дальнейшей модификации. Я мог бы исправить это в будущем.