2009-10-03 18 views
157

Czy istnieje sposób sprawdzenia, czy zdarzenie istnieje w jQuery? Pracuję nad wtyczką, która korzysta z niestandardowych zdarzeń związanych z pseudonimem i chciałbym móc sprawdzić, czy zdarzenie jest powiązane z elementem, czy nie.Sprawdź, czy zdarzenie istnieje w elemencie

+1

tak, w 1.8, wszystko to jest źle? –

+4

@ SylylarSaveland Metoda '$ .data (element," events ")' nigdy nie była oficjalna. Ale w jQuery 1.8.0 ta metoda została pozostawiona przez '$ ._ data (element," events ")'. czytaj dalej [tutaj] (http://blog.jquery.com/2012/08/09/jquery-1-8-released/) – Anton

Odpowiedz

129
$('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 
}); 

można sprawdzić przez karmienie odniesienie do obiektu (nie obiekt jQuery choć) do $ .data, a dla drugiego kanału argumentu „Wydarzenia” i że zwróci obiekt zaludnionych ze wszystkich wydarzeń, takich jak " Kliknij'. Możesz przechodzić przez ten obiekt i zobaczyć, co robi program obsługi zdarzeń.

+2

Bardzo podobał mi się twój pierwszy przykład, $ .data (elem, 'events ") dostarcza znacznie więcej informacji. –

+0

Dodałem, że jako komentarz –

+17

Dlaczego po prostu nie użyjesz $ ("body"). Danych ("zdarzenia")? – James

24

użycie jquery filtr wydarzenie

można go używać jak to

$("a:Event(click)") 
+33

Hah, dziękuję, zbudował tę wtyczkę po otrzymaniu odpowiedzi od lekarza kilka miesięcy temu. –

+19

Od wersji 1.8 ta wtyczka już nie działa –

+3

Uwielbiam to, zamieszczając wtyczkę OP stworzoną jako odpowiedź na jego pytanie :) – Andy

5

napisałem plugin o nazwie hasEventListener który dokładnie robi.

Mam nadzieję, że to pomoże.

+1

Problem polega na tym, jak to działa? Byłem w tym od kilku godzin i wciąż nie jest jasne. Chcę tylko sprawdzić, czy jest na nim zdarzenie kliknięcia i uzyskać powrót boolean, a nie obiekt, ale większość tych metod, przynajmniej te przykłady, są znacznie bardziej skomplikowane. Interesujące: http://www.codingjack.com/playground/jquick/#haseventlistlistener, ale nie używam jquick, ale lubię tę czystą prostotę. –

62

może używać:

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

, aby upewnić się wszystkie zdarzenia kliknięcia są unbinded, a następnie podłączyć wydarzenie

+1

Nie pomaga, jeśli korzystałeś z transmisji na żywo, aby zarejestrować wydarzenie. http://stackoverflow.com/questions/12755646/jquery-datatables-multiple-calls-to-event-handler-with-live-function –

+25

Pytanie ma na celu sprawdzenie, czy zdarzenie istnieje na elemencie, a nie jak rozwiązać istniejące zdarzenia ... – Avi

+35

@Avi, nadal jest dobrą odpowiedzią, ponieważ w wielu przypadkach pytanie jest zadawane z myślą o problemie: "Jak nie zarejestrować dwukrotnie programu obsługi?" – hans

3

poniższy kod dostarczy Ci wszystkich zdarzeń kliknij na dany selektora:

jQuery(selector).data('events').click 

Można iterować nad nim za pomocą każdego lub dla przykładu. Sprawdź długość walidacji, jak:

jQuery(selector).data('events').click.length 

Myślałem, że to komuś pomóż. :)

+1

Nie działa więcej w jQuery> = 1.8. Zobacz odpowiedź Toma Gerkena na działające rozwiązanie. – jbandi

25

Oto jak sprawdzić, czy każde zdarzenie istnieje dla elementu

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

Myślę, że można to uprościć za pomocą: var eventBound = (events! = Null); –

+0

To rozwiązanie działa z jQuery 1.8.0 później. Bardzo dziękuję Tonie Gerken :) –

-1

I zakończyła się robi to

typeof ($('#mySelector').data('events').click) == "object" 
0

Ta praca dla mnie pokazuje obiekty i rodzaj zdarzenia, które miało miejsce.

var foo = $._data($('body').get(0), 'events'); 
    $.each(foo, function(i,o) { 
    console.log(i); // guide of the event 
    console.log(o); // the function definition of the event handler 
    });