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 EventListeners
obiekt. Ma trzy użyteczne metody: add()
, remove()
, i get()
.
Następnie stworzyłem EventListener
obiekt 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 ( EventListener
i EventListeners
).
Stosowanie:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()
tworzy EventListener
obiekt, dodaje go EventListeners
i zwraca EventListener
obiekt, aby można go było później usunąć.
EventListeners.get()
można użyć do wyświetlenia słuchaczy na stronie. Akceptuje EventTarget
cią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.