601 Stimmen

jQuery-Ereignishandler finden, die für ein Objekt registriert sind

Ich muss herausfinden, welche Ereignishandler über ein Objekt registriert sind.

Zum Beispiel:

$("#el").click(function() {...});
$("#el").mouseover(function() {...});

$("#el") tiene anklicken. y Mouseover registriert.

Gibt es eine Funktion, um das herauszufinden, und möglicherweise über die Event-Handler zu iterieren?

Wenn es nicht möglich ist, auf ein jQuery-Objekt durch geeignete Methoden, ist es möglich, auf eine einfache DOM-Objekt?

5 Stimmen

Unglücklicherweise, jetzt: bugs.jquery.com/ticket/10589

2 Stimmen

Unterstützen sowohl jQuery vor als auch nach 1.8: var events = (jQuery._data || jQuery.data)(elem, 'events');

3 Stimmen

Beachten Sie, dass Sie die Dev-Tools von FF und Chrome (F12) verwenden können, um diese Ereignis-Listener zu sehen. Siehe developers.google.com/web/tools/chrome-devtools/debug/ y developer.mozilla.org/de-US/docs/Tools/Page_Inspector/How_to/

12voto

algorhythm Punkte 8122

Ich habe beide Lösungen von @jps in einer Funktion zusammengefasst:

jQuery.fn.getEvents = function() {
    if (typeof(jQuery._data) === 'function') {
        return jQuery._data(this.get(0), 'events') || {};
    }

    // jQuery version < 1.7.?
    if (typeof(this.data) === 'function') {
        return this.data('events') || {};
    }

    return {};
};

Aber Achtung, diese Funktion kann nur Ereignisse zurückgeben, die mit jQuery selbst gesetzt wurden.

6voto

Tom G Punkte 3595

So prüfen Sie auf Ereignisse für ein Element:

var events = $._data(element, "events")

Beachten Sie, dass dies nur mit direkten Event-Handlern funktioniert. Wenn Sie $(document).on("event-name", "jq-selector", function() { //logic }) verwenden, sollten Sie die Funktion getEvents am Ende dieser Antwort sehen

Zum Beispiel:

 var events = $._data(document.getElementById("myElemId"), "events")

o

 var events = $._data($("#myElemId")[0], "events")

Vollständiges Beispiel:

<html>
    <head>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js" type="text/javascript"></script>
        <script>
            $(function() {
                $("#textDiv").click(function() {
                    //Event Handling
                });
                var events = $._data(document.getElementById('textDiv'), "events");
                var hasEvents = (events != null);
            });
        </script>
    </head>
    <body>
        <div id="textDiv">Text</div>
    </body>
</html>

Eine umfassendere Art der Überprüfung, die auch dynamische Zuhörer einschließt, wurde mit $(document).on

function getEvents(element) {
    var elemEvents = $._data(element, "events");
    var allDocEvnts = $._data(document, "events");
    for(var evntType in allDocEvnts) {
        if(allDocEvnts.hasOwnProperty(evntType)) {
            var evts = allDocEvnts[evntType];
            for(var i = 0; i < evts.length; i++) {
                if($(element).is(evts[i].selector)) {
                    if(elemEvents == null) {
                        elemEvents = {};
                    }
                    if(!elemEvents.hasOwnProperty(evntType)) {
                        elemEvents[evntType] = [];
                    }
                    elemEvents[evntType].push(evts[i]);
                }
            }
        }
    }
    return elemEvents;
}

Beispiel für die Verwendung:

getEvents($('#myElemId')[0])

5voto

oligofren Punkte 17762

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önnten die Methode _.data() verwenden, wie jps erwähnt, aber das ist eine interne Methode. Tun Sie also einfach das Richtige und verwenden Sie das Migrate-Plugin, wenn Sie diese Funktionalität benötigen.

Aus der jQuery-Dokumentation über .data("events")

Vor Version 1.9 konnte .data("events") verwendet werden, um jQuerys undokumentierte interne Ereignisdatenstruktur für ein Element abrufen, wenn kein anderer Code ein Datenelement mit dem Namen "events" definiert hatte. Dieser Sonderfall Fall wurde in 1.9 entfernt. Es gibt keine öffentliche Schnittstelle zum Abrufen dieser internen Datenstruktur, und sie bleibt undokumentiert. Allerdings das jQuery Migrate Plugin stellt dieses Verhalten für Code wieder her, der davon abhängt.

4voto

Erutan409 Punkte 682

Ich habe einen benutzerdefinierten jQuery-Selektor erstellt, der sowohl den jQuery-Zwischenspeicher für zugewiesene Event-Handler als auch Elemente überprüft, die die native Methode zum Hinzufügen von Handlern verwenden:

(function($){

    $.find.selectors[":"].event = function(el, pos, match) {

        var search = (function(str){
            if (str.substring(0,2) === "on") {str = str.substring(2);}
            return str;
        })(String(match[3]).trim().toLowerCase());

        if (search) {
            var events = $._data(el, "events");
            return ((events && events.hasOwnProperty(search)) || el["on"+search]);
        }

        return false;

    };

})(jQuery);

Beispiel:

$(":event(click)")

Dies gibt Elemente zurück, denen ein Click-Handler zugeordnet ist.

3voto

Jesan Fafon Punkte 2094

In einem modernen Browser mit ECMAScript 5.1 / Array.prototype.map können Sie auch verwenden

jQuery._data(DOCUMENTELEMENT,'events')["EVENT_NAME"].map(function(elem){return elem.handler;});

in die Konsole Ihres Browsers ein, der die Quelle der Handler durch Kommata getrennt ausgibt. Nützlich, um einen Blick darauf zu werfen, was alles bei einem bestimmten Ereignis abläuft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X