1: Prototype.observe
verwendet Element.addEventListener (siehe den Quellcode )
2: Sie können Folgendes außer Kraft setzen Element.addEventListener
um sich die hinzugefügten Hörer zu merken (praktische Eigenschaft EventListenerList
wurde aus dem DOM3-Spezifikationsvorschlag entfernt). Führen Sie diesen Code aus, bevor ein Ereignis angehängt wird:
(function() {
Element.prototype._addEventListener = Element.prototype.addEventListener;
Element.prototype.addEventListener = function(a,b,c) {
this._addEventListener(a,b,c);
if(!this.eventListenerList) this.eventListenerList = {};
if(!this.eventListenerList[a]) this.eventListenerList[a] = [];
this.eventListenerList[a].push(b);
};
})();
Lesen Sie alle Veranstaltungen von:
var clicks = someElement.eventListenerList.click;
if(clicks) clicks.forEach(function(f) {
alert("I listen to this function: "+f.toString());
});
Und vergessen Sie nicht, die Funktion zu überschreiben Element.removeEventListener
um das Ereignis aus der benutzerdefinierten Element.eventListenerList
.
3: die Element.onclick
Eigentum bedarf hier besonderer Sorgfalt:
if(someElement.onclick)
alert("I also listen tho this: "+someElement.onclick.toString());
4: Vergessen Sie nicht die Element.onclick
Inhaltsattribut: Das sind zwei verschiedene Dinge:
someElement.onclick = someHandler; // IDL attribute
someElement.setAttribute("onclick","otherHandler(event)"); // content attribute
Sie müssen also auch damit umgehen:
var click = someElement.getAttribute("onclick");
if(click) alert("I even listen to this: "+click);
Das Visual Event-Bookmarklet (das in der meistgenannten Antwort erwähnt wird) stiehlt nur den Cache der benutzerdefinierten Bibliotheks-Handler:
Es hat sich herausgestellt, dass es keine Standardmethode des W3C gibt empfohlenen DOM-Schnittstelle gibt, um herauszufinden, welche Ereignis-Listener einem bestimmten Element zugeordnet sind. Während dies ein Versehen zu sein scheint Versehen zu sein scheint, gab es einen Vorschlag, eine Eigenschaft namens eventListenerList in die DOM-Spezifikation der Stufe 3 aufzunehmen, die aber wurde aber leider in späteren Entwürfen wieder entfernt. Daher sind wir gezwungen auf die einzelnen Javascript-Bibliotheken zu schauen, die typischerweise einen Zwischenspeicher für angehängte Ereignisse unterhalten (damit sie später entfernt werden können und andere nützliche Abstraktionen ausführen).
Damit Visual Event also Ereignisse anzeigen kann, muss es in der Lage sein die Ereignisinformationen aus einer Javascript-Bibliothek auszulesen.
Element Overriding kann fragwürdig sein (z.B. weil es einige DOM-spezifische Features wie Live-Collections gibt, die nicht in JS kodiert werden können), aber es gibt die eventListenerList Unterstützung nativ und es funktioniert in Chrome, Firefox und Opera (funktioniert nicht in IE7).
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