Ich habe kürzlich mit Ereignissen gearbeitet und wollte alle Ereignisse auf einer Seite anzeigen / steuern. Nachdem ich mir mögliche Lösungen angesehen habe, habe ich beschlossen, meinen eigenen Weg zu gehen und ein benutzerdefiniertes System zur Überwachung von Ereignissen zu erstellen. Also habe ich drei Dinge getan.
Zuerst brauchte ich einen Container für alle Ereignis-Listener auf der Seite: das ist das EventListenersObjekt. Es verfügt über drei nützliche Methoden: add(), remove(), und get().
Als nächstes habe ich eine EventListenerAufgabe , die notwendigen Informationen für die Veranstaltung zu halten, das heißt: target, type, callback, options, useCapture, wantsUntrusted, und ein Verfahren hinzugefügt remove()entfernen Sie den Hörer.
Zuletzt habe ich das Native addEventListener()und die removeEventListener()Methoden erweitert, damit sie mit den von mir erstellten Objekten ( EventListenerund EventListeners) funktionieren .
Verwendungszweck:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()Erstellt ein EventListenerObjekt, fügt es hinzu EventListenersund gibt das EventListenerObjekt zurück, damit es später entfernt werden kann.
EventListeners.get()kann verwendet werden, um die Listener auf der Seite anzuzeigen. Es akzeptiert eine EventTargetoder eine Zeichenfolge (Ereignistyp).
// EventListeners.get(document.body);
// EventListeners.get("click");
Demo
Angenommen, wir möchten jeden Ereignis-Listener auf dieser aktuellen Seite kennenlernen. Wir können das tun (vorausgesetzt, Sie verwenden eine Skriptmanager-Erweiterung, in diesem Fall Tampermonkey). Das folgende Skript führt dies aus:
// ==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);
Und wenn wir alle Listener auflisten, heißt es, dass es 299 Event-Listener gibt. Es "scheint" einige Duplikate zu geben, aber ich weiß nicht, ob es sich wirklich um Duplikate handelt. Nicht jeder Ereignistyp ist dupliziert, daher können alle diese "Duplikate" ein einzelner Listener sein.

Code finden Sie in meinem Repository. Ich wollte es hier nicht posten, weil es ziemlich lang ist.
Update: Dies scheint mit jQuery nicht zu funktionieren. Wenn ich den EventListener untersuche, sehe ich, dass der Rückruf ist
function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}
Ich glaube, das gehört zu jQuery und ist nicht der eigentliche Rückruf. jQuery speichert den tatsächlichen Rückruf in den Eigenschaften des EventTargets:
$(document.body).click(function () {
console.log("jquery click");
});

Um einen Ereignis-Listener zu entfernen, muss der eigentliche Rückruf an die removeEventListener()Methode übergeben werden. Damit dies mit jQuery funktioniert, müssen weitere Änderungen vorgenommen werden. Ich könnte das in Zukunft beheben.