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