javascript - Kontrollera om ett event finns på ett element


Finns det ett sätt att kontrollera om en händelse existerar i jQuery? Jag arbetar med ett plugin som använder anpassade namnrymddshändelser och skulle vilja kunna kontrollera om händelsen är bunden till ett element eller inte.

Svar #1

$('body').click(function(){ alert('test' )})

var foo = $.data( $('body').get(0), 'events' ).click
// you can query $.data( object, 'events' ) and get an object back, then see what events are attached to it.

$.each( foo, function(i,o) {
    alert(i) // guid of the event
    alert(o) // the function definition of the event handler
});

Du kan inspektera genom att mata objektreferensen (inte jQuery-objektet dock) till $.data, och för det andra argumentet mata in 'events' och det kommer att returnera ett objekt fyllt med alla händelser såsom 'click'. Du kan loopa igenom det objektet och se vad händelsehanteraren gör.

Svar #2

Du kan använda:

$("#foo").unbind('click');

för att försäkra att alla klickhändelser är avbundna, koppla sedan din händelse

Svar #3

För att kontrollera händelser på ett element:

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

Observera att detta endast fungerar med direkta eventhanterare, om du använder $ (document).on("event-name", "jq-selector", function() { //logik }), kommer du att vilja titta på getEvents-funktionen längst ner i detta svar

Till exempel:

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

eller

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

Fullt exempel:

<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>

Ett mer fullständigt sätt att kontrollera, som inkluderar dynamiska lyssnare, installerade med $ (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;
}

Exempel på användning:

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

Svar #4

använd jquery händelsefilter

du kan använda det så här

$("a:Event(click)")

Relaterade artiklar