Ostatnio pracowałem z wydarzeniami i chciałem wyświetlić / kontrolować wszystkie zdarzenia na stronie. Po przeanalizowaniu możliwych rozwiązań postanowiłem pójść własną drogą i stworzyć niestandardowy system monitorowania zdarzeń. Zrobiłem więc trzy rzeczy.
Po pierwsze potrzebowałem kontenera dla wszystkich detektorów zdarzeń na stronie: to jest EventListenersobiekt. Ma trzy użyteczne metody: add(), remove(), i get().
Następnie stworzyłem EventListenerobiekt do przechowywania informacji niezbędnych do zdarzenia, czyli: target, type, callback, options, useCapture, wantsUntrusted, i dodaje metodę remove()usuwania słuchacza.
Na koniec rozszerzyłem język macierzysty addEventListener()i removeEventListener()metody, aby działały z obiektami, które utworzyłem ( EventListeneri EventListeners).
Stosowanie:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()tworzy EventListenerobiekt, dodaje go EventListenersi zwraca EventListenerobiekt, aby można go było później usunąć.
EventListeners.get()można użyć do wyświetlenia słuchaczy na stronie. Akceptuje EventTargetciąg lub ciąg znaków (typ zdarzenia).
// EventListeners.get(document.body);
// EventListeners.get("click");
Próbny
Powiedzmy, że chcemy poznać każdego detektora zdarzeń na bieżącej stronie. Możemy to zrobić (zakładając, że używasz rozszerzenia menedżera skryptów, w tym przypadku Tampermonkey). Następujący skrypt to robi:
// ==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);
A kiedy podajemy listę wszystkich słuchaczy, mówi się, że jest 299 słuchaczy zdarzeń. „Wydaje się”, że są jakieś duplikaty, ale nie wiem, czy naprawdę są duplikatami. Nie każdy typ zdarzenia jest duplikowany, więc wszystkie te „duplikaty” mogą być pojedynczymi detektorami.

Kod można znaleźć w moim repozytorium. Nie chciałem go tutaj zamieszczać, ponieważ jest raczej długi.
Aktualizacja: Wydaje się, że to nie działa z jQuery. Kiedy badam EventListener, widzę, że jest to wywołanie zwrotne
function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}
Uważam, że należy to do jQuery i nie jest rzeczywistym wywołaniem zwrotnym. jQuery przechowuje rzeczywiste wywołanie zwrotne we właściwościach EventTarget:
$(document.body).click(function () {
console.log("jquery click");
});

Aby usunąć detektor zdarzeń, faktyczne wywołanie zwrotne musi zostać przekazane do removeEventListener()metody. Aby więc działał z jQuery, wymaga dalszych modyfikacji. Mogę to naprawić w przyszłości.