Muszę znaleźć, które procedury obsługi zdarzeń są zarejestrowane dla obiektu.
Na przykład:
$("#el").click(function() {...});
$("#el").mouseover(function() {...});
$("#el")
nie kliknąć i mouseOver zarejestrowany.
Czy istnieje funkcja, która się o tym dowie i może iteruje procedury obsługi zdarzeń?
Jeśli nie jest to możliwe na obiekcie jQuery za pomocą odpowiednich metod, czy jest to możliwe na zwykłym obiekcie DOM?
var events = (jQuery._data || jQuery.data)(elem, 'events');
Odpowiedzi:
Począwszy od jQuery 1.8, dane zdarzenia nie są już dostępne z „publicznego interfejsu API” dla danych. Przeczytaj ten post na blogu jQuery . Powinieneś teraz użyć tego zamiast:
elem
powinien być elementem HTML, a nie obiektem jQuery lub selektorem.Pamiętaj, że jest to wewnętrzna, „prywatna” struktura i nie powinna być modyfikowana. Używaj tego tylko do celów debugowania.
W starszych wersjach jQuery może być konieczne użycie starej metody:
źródło
$._data($(elem).get(0), "events")
handler: function () {
we właściwości click. Musiałem dwukrotnie kliknąć część funkcji, aby ją rozwinąć i wyświetlić pełną zawartość funkcji.var events = (jQuery._data || jQuery.data)(elem, 'events');
Możesz to zrobić, indeksując zdarzenia (od jQuery 1.8+), w następujący sposób:
Oto przykład, z którym możesz grać:
źródło
jQuery._data( jQuery("#el")[0], "events" );
zamiast metody „dane publiczne”jQuery("#el").data("events")
.events
Obiekt nie został faktycznie przechowywane w.data()
przez długi czas, my przycięte kilka bajtów kodu przez usunięcie tej „proxy” z „publicznych API”W przypadku jQuery 1.8+ nie będzie to już działać, ponieważ dane wewnętrzne są umieszczane w innym obiekcie.
Najnowszym nieoficjalnym (ale działa również w poprzednich wersjach, przynajmniej w wersji 1.7.2) sposobem jest teraz -
$._data(element, "events")
Podkreśla („_”), co robi różnicę tutaj. Wewnętrznie się woła
$.data(element, name, null, true)
, ostatni (czwarty) parametr to wewnętrzny („pvt”).źródło
jQuery._data( element, "events" )
jest teraz „prawidłowym” sposobem na uzyskanie tych informacji.Bezwstydna wtyczka, ale możesz użyć findHandlerJS
Aby z niego skorzystać, wystarczy dołączyć findHandlersJS (lub po prostu skopiować i wkleić surowy kod javascript do okna konsoli chrome) oraz określić typ zdarzenia i selektor jquery dla elementów, którymi jesteś zainteresowany.
Na przykład możesz szybko znaleźć programy obsługi zdarzeń, o których wspomniałeś, robiąc
Oto, co zostanie zwrócone:
Rzeczywisty element, w którym zarejestrowano moduł obsługi zdarzeń
Tablica z informacjami o modułach obsługi zdarzeń jquery dla interesującego nas typu zdarzenia (np. kliknięcie, zmiana itp.)
Rzeczywista metoda obsługi zdarzeń, którą można zobaczyć, klikając ją prawym przyciskiem myszy i wybierając opcję Pokaż definicję funkcji
Selektor przewidziany dla zdarzeń delegowanych. Będzie pusty dla bezpośrednich wydarzeń.
Wymień elementy zawierające elementy, na które cel ten obsługuje. Na przykład dla procedury obsługi zdarzeń delegowanych, która jest zarejestrowana w obiekcie dokumentu i jest kierowana do wszystkich przycisków na stronie, ta właściwość wyświetli wszystkie przyciski na stronie. Możesz je najechać myszką i zobaczyć je podświetlone w chromie.
Możesz spróbować tutaj
źródło
Używam eventbug wtyczki do Firebug do tego celu.
źródło
Połączyłem oba rozwiązania od @jps do jednej funkcji:
Ale uwaga, ta funkcja może zwracać tylko zdarzenia ustawione za pomocą samego jQuery.
źródło
Od wersji 1.9 nie ma udokumentowanego sposobu odzyskiwania zdarzeń poza użyciem wtyczki Migrate w celu przywrócenia starego zachowania. Możesz użyć metody _.data (), jak wspomina jps, ale jest to metoda wewnętrzna. Więc po prostu postępuj właściwie i skorzystaj z wtyczki Migrate, jeśli potrzebujesz tej funkcji.
Z dokumentacji jQuery na
.data("events")
źródło
jQuery._data( elem, "events" );
...Aby sprawdzić zdarzenia w elemencie:
Na przykład:
lub
Pełny przykład:
Bardziej kompletny sposób sprawdzenia, obejmujący dynamiczne nasłuchiwania, zainstalowany z $ (dokument) .on
Przykładowe użycie:
źródło
getEvents
metoda jest zbyt świetna, ale chodzi o to, że daje zduplikowane wpisy w IE11 (znowu wiem, IE, ale firma tego potrzebuje ...). EDYCJA: Dane $ ._ zawierają zduplikowane zdarzenia dla elementu, chociaż na FF nie zawiera żadnego ... Dziwnego świata IE. Ale ważne jest, aby uważać na możliwość posiadania zduplikowanych wydarzeń.Utworzyłem niestandardowy selektor jQuery, który sprawdza zarówno pamięć podręczną przypisanych procedur obsługi zdarzeń jQuery, jak i elementy, które używają natywnej metody ich dodawania:
Przykład:
Zwróci to elementy, do których dołączony jest moduł obsługi kliknięć.
źródło
W nowoczesnej przeglądarce z ECMAScript 5.1 /
Array.prototype.map
możesz także używaćw konsoli przeglądarki, która wydrukuje źródło programów obsługi, rozdzielane przecinkami. Przydatne do zerknięcia na to, co dzieje się na danym wydarzeniu.
źródło
jQuery._data('ct100_ContentPlaceHolder1_lcsSection','events')["EVENT_NAME"].map(function(elem){return elem.handler;});
Uncaught TypeError: Nie można odczytać właściwości „EVENT_NAME” z niezdefiniowanej w <anonymous>: 1: 62'ct100_ContentPlaceHolder1_lcsSection'
jest ciągiem, a nie elementem DOM.Zdarzenia można odzyskać za pomocą:
lub jQuery 1.8+:
Uwaga: Zdarzenia ograniczone przy użyciu
$('selector').live('event', handler)
można odzyskać za pomocą:źródło
Muszę powiedzieć, że wiele odpowiedzi jest interesujących, ale ostatnio miałem podobny problem i rozwiązanie było niezwykle proste, idąc drogą DOM. Jest inaczej, ponieważ nie iterujesz, ale celujesz bezpośrednio w potrzebne wydarzenie, ale poniżej podam bardziej ogólną odpowiedź.
Miałem zdjęcie z rzędu:
Do tego obrazu dołączony jest moduł obsługi zdarzenia kliknięcia:
Moim zamiarem było rozszerzenie obszaru klikalnego na cały wiersz, więc najpierw otrzymałem wszystkie obrazy i wiersze względne:
Teraz w rzeczywistej anwer linii Właśnie zrobił następująco, dając odpowiedź na oryginalne pytanie:
Więc pobrałem moduł obsługi zdarzeń bezpośrednio z elementu DOM i umieściłem go w module obsługi zdarzeń kliknięcia jQuery. Działa jak marzenie.
Teraz do ogólnego przypadku. W dawnych czasach przed jQuery wszystkie zdarzenia były dołączane do obiektu za pomocą dwóch prostych, ale potężnych funkcji, które dali nam śmiertelnicy Douglas Crockford :
źródło
Wypróbuj wtyczkę debuggera jquery, jeśli używasz chrome: https://chrome.google.com/webstore/detail/jquery-debugger/dbhhnnnpaeobfddmlalhnehgclcmjimi?hl=pl
źródło
Innym sposobem na to jest użycie jQuery do przechwycenia elementu, a następnie przejrzenie faktycznego Javascript, aby uzyskać, ustawić i grać z modułami obsługi zdarzeń. Na przykład:
źródło
Połączyłem niektóre z powyższych odpowiedzi i stworzyłem ten szalenie wyglądający, ale funkcjonalny skrypt, który, mam nadzieję, wymienia większość słuchaczy zdarzeń w danym elemencie. Tutaj możesz go zoptymalizować.
źródło
jQuery nie pozwala ci po prostu uzyskać dostępu do zdarzeń dla danego elementu. Możesz uzyskać do nich dostęp za pomocą nieudokumentowanej metody wewnętrznej
Ale wciąż nie da ci wszystkich wydarzeń, a ściślej mówiąc, nie pokaże ci wydarzeń, do których przypisano
Te zdarzenia są przechowywane w dokumencie, dzięki czemu można je pobrać, przeglądając
ale to ciężka praca, ponieważ są wydarzenia dla całej strony.
Tom G powyżej stworzył funkcję, która filtruje dokument tylko pod kątem zdarzeń danego elementu i łączy dane wyjściowe obu metod, ale miał wadę powielania zdarzeń w danych wyjściowych (i skutecznie na wewnętrznej liście zdarzeń jQuery elementu bałaganu w aplikacji). Naprawiłem tę wadę, a kod znajdziesz poniżej. Wystarczy wkleić go do konsoli programisty lub kodu aplikacji i wykonać w razie potrzeby, aby uzyskać ładną listę wszystkich zdarzeń dla danego elementu.
Należy zauważyć, że element jest tak naprawdę HTMLElement, a nie obiektem jQuery.
źródło