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