Ich habe kürzlich mit Ereignissen gearbeitet und wollte alle Ereignisse auf einer Seite anzeigen/kontrollieren. Nachdem ich mir mögliche Lösungen angesehen hatte, beschloss ich, meinen eigenen Weg zu gehen und ein benutzerdefiniertes System zur Überwachung von Ereignissen zu erstellen. Ich habe also drei Dinge getan.
Zuerst brauchte ich einen Container für alle Ereignis-Listener auf der Seite: das ist die EventListeners
Objekt. Es hat drei nützliche Methoden: add()
, remove()
et get()
.
Als nächstes habe ich eine EventListener
Objekt, das die notwendigen Informationen für das Ereignis enthält, d.h.: target
, type
, callback
, options
, useCapture
, wantsUntrusted
und fügte eine Methode remove()
um den Hörer zu entfernen.
Schließlich habe ich die native addEventListener()
y removeEventListener()
Methoden, damit sie mit den von mir erstellten Objekten funktionieren ( EventListener
y EventListeners
).
Verwendung:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()
erstellt eine EventListener
Objekt, fügt es zu EventListeners
EventListener
Objekt, so dass es später entfernt werden kann.
EventListeners.get()
kann verwendet werden, um die Zuhörer auf der Seite anzuzeigen. Sie akzeptiert eine EventTarget
oder eine Zeichenkette (Ereignistyp).
// EventListeners.get(document.body);
// EventListeners.get("click");
Demo
Nehmen wir an, wir wollen alle Ereignis-Listener auf der aktuellen Seite kennen. Das können wir tun (vorausgesetzt, Sie verwenden eine Skriptmanager-Erweiterung, in diesem Fall Tampermonkey). Das folgende Skript tut dies:
// ==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 Zuhörer auflisten, gibt es 299 Ereigniszuhörer. Es "scheint" einige Duplikate zu geben, aber ich weiß nicht, ob sie wirklich Duplikate sind. Nicht jeder Ereignistyp wird dupliziert, so dass alle diese "Duplikate" ein einzelner Zuhörer sein könnten.
![screenshot of console listing all event listeners in this page]()
Den Code finden Sie auf meiner Repository. Ich wollte ihn hier nicht posten, weil er ziemlich lang ist.
Aktualisierung: Das scheint mit jQuery nicht zu funktionieren. Wenn ich den EventListener untersuche, sehe ich, dass der Callback ist
function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}
Ich glaube, dies gehört zu jQuery, und ist nicht der eigentliche Rückruf. jQuery speichert den eigentlichen Rückruf in den Eigenschaften des EventTarget:
$(document.body).click(function () {
console.log("jquery click");
});
![enter image description here]()
Um einen Ereignis-Listener zu entfernen, muss der aktuelle Callback an die removeEventListener()
Methode. Damit dies mit jQuery funktioniert, sind also weitere Änderungen erforderlich. Ich könnte das in Zukunft beheben.
4 Stimmen
Wie werden die Ereignisse überhaupt miteinander verbunden? Verwenden Sie eine Bibliothek (z. B. Prototype, jQuery, etc.)?
0 Stimmen
Es ist wichtig zu beachten, dass mehrere Callback-Funktionen für denselben Ereignistyp über
element.addEventListener(type, callback, [bubble])
, währendelement.onclick = function
wird bei jeder Zuweisung überschrieben.6 Stimmen
Ruft alle Ereignisse neben ihrem jeweiligen Element ab:
Array.from(document.querySelectorAll("*")).forEach(e => { const ev = getEventListeners(e); if (Object.keys(ev).length !== 0) {console.log(e, ev)} })
0 Stimmen
Sie können die
addEventListener
und erfassen eine Liste aller Zuhörer im DOM-Element. Hier ein Beispielcode stackoverflow.com/a/64484951/1812732