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