Ich muss herausfinden, welche Ereignishandler über einem Objekt registriert sind.
Zum Beispiel:
$("#el").click(function() {...});
$("#el").mouseover(function() {...});
$("#el")
hat Click and Mouseover registriert.
Gibt es eine Funktion, um dies herauszufinden und möglicherweise die Ereignishandler zu durchlaufen?
Wenn es auf einem jQuery-Objekt mit geeigneten Methoden nicht möglich ist, ist es auf einem einfachen DOM-Objekt möglich?
var events = (jQuery._data || jQuery.data)(elem, 'events');
Antworten:
Ab jQuery 1.8 sind die Ereignisdaten nicht mehr über die "öffentliche API" für Daten verfügbar. Lesen Sie diesen jQuery-Blogbeitrag . Sie sollten dies jetzt stattdessen verwenden:
elem
sollte ein HTML-Element sein, kein jQuery-Objekt oder Selektor.Bitte beachten Sie, dass dies eine interne, "private" Struktur ist und nicht geändert werden sollte. Verwenden Sie dies nur zum Debuggen.
In älteren Versionen von jQuery müssen Sie möglicherweise die alte Methode verwenden:
quelle
$._data($(elem).get(0), "events")
handler: function () {
in der click-Eigenschaft angezeigt. Ich musste auf den Funktionsteil doppelklicken, um ihn zu erweitern und den vollständigen Inhalt der Funktion anzuzeigen.var events = (jQuery._data || jQuery.data)(elem, 'events');
Sie können dies tun, indem Sie die Ereignisse (ab jQuery 1.8+) wie folgt crawlen:
Hier ist ein Beispiel, mit dem Sie spielen können:
quelle
jQuery._data( jQuery("#el")[0], "events" );
statt der ‚öffentlichen Daten‘ Methode:jQuery("#el").data("events")
. Dasevents
Objekt wurde schon lange nicht mehr gespeichert..data()
Wir haben ein paar Bytes Code herausgeschnitten, indem wir diesen "Proxy" aus der "öffentlichen API" entfernt habenAb jQuery 1.8+ funktioniert dies nicht mehr, da die internen Daten in einem anderen Objekt abgelegt werden.
Die neueste inoffizielle Methode (funktioniert aber auch in früheren Versionen, zumindest in Version 1.7.2) ist jetzt:
$._data(element, "events")
Der Unterstrich ("_") macht hier den Unterschied. Intern wird aufgerufen
$.data(element, name, null, true)
, der letzte (vierte) Parameter ist ein interner ("pvt").quelle
jQuery._data( element, "events" )
ist der "richtige" Weg, um diese Informationen jetzt zu erhalten.Schamloser Stecker, aber Sie können findHandlerJS verwenden
Um es zu verwenden, müssen Sie nur findHandlersJS einschließen (oder einfach den rohen Javascript-Code kopieren und einfügen in das Konsolenfenster von Chrome ) und den Ereignistyp und eine Abfrage-Auswahl für die Elemente angeben, an denen Sie interessiert sind.
In Ihrem Beispiel könnten Sie schnell die Event-Handler finden, die Sie dabei erwähnt haben
Folgendes wird zurückgegeben:
Das tatsächliche Element, in dem der Ereignishandler registriert wurde
Array mit Informationen zu den jquery-Ereignishandlern für den Ereignistyp, an dem wir interessiert sind (z. B. Klicken, Ändern usw.)
Tatsächliche Event-Handler-Methode, die Sie sehen können, indem Sie mit der rechten Maustaste darauf klicken und Funktionsdefinition anzeigen auswählen
Der Selektor für delegierte Ereignisse. Es ist für direkte Ereignisse leer.
Liste mit den Elementen, auf die dieser Ereignishandler abzielt. Beispielsweise listet diese Eigenschaft für einen delegierten Ereignishandler, der im Dokumentobjekt registriert ist und auf alle Schaltflächen auf einer Seite abzielt, alle Schaltflächen auf der Seite auf. Sie können mit der Maus darüber fahren und sie in Chrom hervorheben.
Sie können es hier versuchen
quelle
Ich benutze Eventbug Plugin um Firebug für diesen Zweck.
quelle
Ich habe beide Lösungen von @jps zu einer Funktion kombiniert:
Beachten Sie jedoch, dass diese Funktion nur Ereignisse zurückgeben kann, die mit jQuery selbst festgelegt wurden.
quelle
Ab Version 1.9 gibt es keine dokumentierte Möglichkeit, die Ereignisse abzurufen, außer das Migrate-Plugin zu verwenden, um das alte Verhalten wiederherzustellen. Sie können die Methode _.data () als jps-Erwähnung verwenden, dies ist jedoch eine interne Methode. Tun Sie einfach das Richtige und verwenden Sie das Migrate-Plugin, wenn Sie diese Funktionalität benötigen.
Ab der jQuery-Dokumentation
.data("events")
quelle
jQuery._data( elem, "events" );
...So suchen Sie nach Ereignissen für ein Element:
Zum Beispiel:
oder
Vollständiges Beispiel:
Eine umfassendere Möglichkeit zur Überprüfung, einschließlich dynamischer Listener, die mit $ (document) .on installiert wurden
Anwendungsbeispiel:
quelle
getEvents
Methode ist übermäßig großartig, aber die Sache ist, dass sie doppelte Einträge in IE11 liefert (ich weiß, IE wieder, aber das Unternehmen braucht es ...). BEARBEITEN: $ ._ Daten enthalten doppelte Ereignisse für Elemente, obwohl sie in FF keine ... Seltsame IE-Welt enthalten. Es ist jedoch wichtig, auf diese Möglichkeit von doppelten Ereignissen zu achten.Ich habe einen benutzerdefinierten jQuery-Selektor erstellt, der sowohl den Cache der zugewiesenen Ereignishandler von jQuery als auch Elemente überprüft, die die native Methode zum Hinzufügen verwenden:
Beispiel:
Dadurch werden Elemente zurückgegeben, an die ein Klick-Handler angehängt ist.
quelle
In einem modernen Browser mit ECMAScript 5.1 /
Array.prototype.map
können Sie auch verwendenIn Ihrer Browserkonsole, die die Quelle der Handler druckt, wird dies durch Kommas getrennt. Nützlich, um einen Blick auf das zu werfen, was bei einem bestimmten Ereignis alles läuft.
quelle
jQuery._data('ct100_ContentPlaceHolder1_lcsSection','events')["EVENT_NAME"].map(function(elem){return elem.handler;});
Nicht gefangener TypeError: Die Eigenschaft 'EVENT_NAME' von undefined at <anonymous> kann nicht gelesen werden: 1: 62'ct100_ContentPlaceHolder1_lcsSection'
ist eine Zeichenfolge, kein DOM-Element.Ereignisse können abgerufen werden mit:
oder jQuery 1.8+:
Hinweis: Ereignisse, die mit begrenzt sind,
$('selector').live('event', handler)
können abgerufen werden mit:quelle
Ich muss sagen, dass viele der Antworten interessant sind, aber kürzlich hatte ich ein ähnliches Problem und die Lösung war extrem einfach, indem ich den DOM-Weg ging. Es ist anders, weil Sie nicht iterieren, sondern direkt auf das Ereignis zielen, das Sie benötigen, aber im Folgenden werde ich eine allgemeinere Antwort geben.
Ich hatte ein Bild in einer Reihe:
Und diesem Bild war ein Klickereignishandler zugeordnet:
Meine Absicht war es, den anklickbaren Bereich auf die gesamte Zeile zu erweitern, sodass ich zuerst alle Bilder und relativen Zeilen erhielt:
In der eigentlichen Antwortzeile habe ich nur Folgendes getan und eine Antwort auf die ursprüngliche Frage gegeben:
Also habe ich den Ereignishandler direkt aus dem DOM-Element abgerufen und in den jQuery-Click-Ereignishandler eingefügt. Klappt wunderbar.
Nun zum allgemeinen Fall. In den alten Tagen vor jQuery konnten alle Ereignisse mit zwei einfachen, aber leistungsstarken Funktionen an ein Objekt angehängt werden, die uns Sterblichen von Douglas Crockford geschenkt wurden :
quelle
Versuchen Sie das JQuery-Debugger-Plugin, wenn Sie Chrome verwenden: https://chrome.google.com/webstore/detail/jquery-debugger/dbhhnnnpaeobfddmlalhnehgclcmjimi?hl=de
quelle
Eine andere Möglichkeit besteht darin, einfach jQuery zu verwenden, um das Element zu erfassen, und dann das eigentliche Javascript zu durchlaufen, um die Ereignishandler abzurufen, festzulegen und mit ihnen zu spielen. Zum Beispiel:
quelle
Ich habe einige der obigen Antworten kombiniert und dieses verrückt aussehende, aber funktionale Skript erstellt, das hoffentlich die meisten Ereignis-Listener für das angegebene Element auflistet. Fühlen Sie sich frei, es hier zu optimieren.
quelle
Mit jQuery können Sie nicht einfach auf die Ereignisse für ein bestimmtes Element zugreifen. Sie können mit einer nicht dokumentierten internen Methode darauf zugreifen
Aber es werden Ihnen immer noch nicht alle Ereignisse angezeigt, um genau zu sein, es werden Ihnen keine Ereignisse angezeigt, denen Sie zugewiesen sind
Diese Ereignisse werden im Dokument gespeichert, sodass Sie sie durch Durchsuchen abrufen können
Aber das ist harte Arbeit, da es Ereignisse für die gesamte Webseite gibt.
Tom G hat oben eine Funktion erstellt, die das Dokument nur nach Ereignissen eines bestimmten Elements filtert und die Ausgabe beider Methoden zusammenführt. Es gab jedoch einen Fehler beim Duplizieren von Ereignissen in der Ausgabe (und effektiv in der internen jQuery-Ereignisliste des Elements, die mit Ihrer Anwendung in Konflikt gerät). Ich habe diesen Fehler behoben und Sie können den Code unten finden. Fügen Sie es einfach in Ihre Entwicklungskonsole oder in Ihren App-Code ein und führen Sie es bei Bedarf aus, um eine schöne Liste aller Ereignisse für ein bestimmtes Element zu erhalten.
Was wichtig ist, ist, dass das Element tatsächlich HTMLElement ist, nicht das jQuery-Objekt.
quelle