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 EventListeners
Objekt. Es verfügt über drei nützliche Methoden: add()
, remove()
, und get()
.
Als nächstes habe ich eine EventListener
Aufgabe , 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 ( EventListener
und EventListeners
) funktionieren .
Verwendungszweck:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()
Erstellt ein EventListener
Objekt, fügt es hinzu EventListeners
und gibt das EventListener
Objekt zurück, damit es später entfernt werden kann.
EventListeners.get()
kann verwendet werden, um die Listener auf der Seite anzuzeigen. Es akzeptiert eine EventTarget
oder 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.