javascript - Sjekk om hendelse finnes på element


Finnes det en måte å sjekke om en hendelse eksisterer i jQuery? Jeg jobber med et plugin som bruker egendefinerte navngitte hendelser, og ønsker å kunne sjekke om hendelsen er bundet til et element eller ikke.

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 inspisere ved å sende objektreferansen (ikke jQuery-objektet) til $.data, og som andre argument sender du 'events', og det vil returnere et objekt fylt med alle hendelsene som 'click'. Du kan loope gjennom det objektet og se hva hendelsesbehandleren gjør.

Svar #2

Du kan bruke:

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

for å sørge for at alle klikkhendelser er koblet fra, legg deretter til din hendelse

Svar #3

For å sjekke etter hendelser på et element:

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

Merk at dette bare vil fungere med direkte hendelseshåndterere. Hvis du bruker $(document).on("event-name", "jq-selector", function() { //logikk }), vil du ønske å se getEvents-funksjonen nederst i dette svaret

For eksempel:

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

eller

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

Fullt eksempel:

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

En mer fullstendig måte å sjekke på, som inkluderer dynamiske lyttere, installert 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;
}

Eksempel på bruk:

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

Svar #4

bruk jquery-hendelsesfilter

du kan bruke det slik

$("a:Event(click)")

Relaterte artikler