Mam stronę, na której niektóre detektory zdarzeń są dołączone do pól wprowadzania i pól wyboru. Czy istnieje sposób, aby dowiedzieć się, które detektory zdarzeń obserwują dany węzeł DOM i dla którego zdarzenia?
Wydarzenia są dołączane przy użyciu:
- Prototypowe
Event.observe
; - DOM
addEventListener
; - Jako atrybut elementu
element.onclick
.
javascript
events
dom
Navneet
źródło
źródło
element.addEventListener(type, callback, [bubble])
, aelement.onclick = function
nadpisuje się za każdym razem, gdy przypisujesz.Odpowiedzi:
Jeśli chcesz tylko sprawdzić, co dzieje się na stronie, możesz wypróbować bookmarklet Event wizualny .
Aktualizacja : Visual Event 2 dostępne.
źródło
EventBug
wtyczkę Firebug .To zależy od tego, jak zdarzenia są dołączone. Dla ilustracji załóżmy, że mamy następujący moduł obsługi kliknięć:
Zamierzamy dołączyć go do naszego elementu przy użyciu różnych metod, z których niektóre umożliwiają inspekcję, a inne nie.
Metoda A) moduł obsługi pojedynczego zdarzenia
Metoda B) obsługa wielu zdarzeń
Metoda C): jQuery
1.3.x
1.4.x (przechowuje moduł obsługi w obiekcie)
(Zobacz
jQuery.fn.data
ijQuery.data
)Metoda D): Prototyp (niechlujny)
1.5.x
1.6 do 1.6.0.3 włącznie (tutaj było bardzo trudno)
1.6.1 (trochę lepiej)
źródło
addEventListener
?.data('events')
jak były wcześniej. Aby uzyskać dostęp do wewnętrznych danych zdarzeń, użyj$._data(elem, 'events')
. Zauważ, że ta funkcja jest oznaczona jako „tylko do użytku wewnętrznego” w źródle jQuery, więc nie obiecuję, że zawsze będzie działać w przyszłości, ale wierzę, że działała od jQuery 1.7 i nadal działa.Obsługa Chrome, Firefox, Vivaldi i Safari
getEventListeners(domElement)
w konsoli narzędzi programisty.Można to wykorzystać do większości celów debugowania.
Poniżej znajduje się bardzo dobre odniesienie do korzystania z niego: https://developers.google.com/web/tools/chrome-devtools/console/utilities#geteventlisteners
źródło
getEventListeners(object)
obj getEventListeners()
var list = getEventListeners(document.getElementById("YOURIDHERE")); console.log(list["focus"][0]["listener"].toString())
. Zmień „focus” na wydarzenie, które chcesz sprawdzić, i numer, jeśli na tym samym wydarzeniu jest wielu słuchaczy.getEventListeners($0)
sprawi, że nasłuchiwania zdarzeń będą dotyczyły elementu, na którym skupiłeś się w narzędziach programistycznych Chrome. Używam tego cały czas. Uwielbiam nie używać funkcji querySelector ani get__By_Teraz robi to WebKit Inspector w przeglądarkach Chrome lub Safari. Wyświetli detektory zdarzeń dla elementu DOM po wybraniu go w panelu Elementy.
źródło
Możliwe jest wyświetlenie listy wszystkich detektorów zdarzeń w JavaScript: To nie jest takie trudne; musisz tylko zhakować
prototype
metodę elementów HTML ( przed dodaniem detektorów).Teraz każdy element anchor (
a
) będzie miałlastListenerInfo
właściwość, która zawiera wszystkie jego detektory. Działa nawet do usuwania słuchaczy z anonimowymi funkcjami.źródło
Node.prototype
? I tak właśnieHTMLAnchorElement
dziedziczy.addEventListener
.Użyj getEventListeners w Google Chrome :
źródło
(Przepisanie odpowiedzi na to pytanie, ponieważ jest ono tutaj istotne).
Podczas debugowania, jeśli chcesz tylko zobaczyć wydarzenia, polecam albo ...
Jeśli chcesz użyć zdarzeń w kodzie i używasz jQuery przed wersją 1.8 , możesz użyć:
zdobyć wydarzenia. Począwszy od wersji 1.8, używanie .data („zdarzenia”) jest przerywane (patrz ten zgłoszenie błędu ). Możesz użyć:
Kolejny przykład: zapisz wszystkie zdarzenia kliknięcia w określonym łączu do konsoli:
(patrz działający przykład na http://jsfiddle.net/HmsQC/ )
Niestety, użycie danych $ ._ nie jest zalecane, z wyjątkiem debugowania, ponieważ jest to wewnętrzna struktura jQuery i może ulec zmianie w przyszłych wydaniach. Niestety nie znam innych łatwych sposobów uzyskania dostępu do wydarzeń.
źródło
$._data(elem, "events")
nie działa z jQuery 1.10, przynajmniej w przypadku zdarzeń zarejestrowanych przy użyciu$(elem).on('event', ...)
. Czy ktoś wie, jak je debugować?$._data
może być element, a nie obiekt jQuery. Muszę więc naprawić mój powyższy przykładconsole.log($._data($myLink[0], "events").click);
1:
Prototype.observe
używa Element.addEventListener (zobacz kod źródłowy )2: Możesz przesłonić,
Element.addEventListener
aby zapamiętać dodane detektory (przydatna właściwośćEventListenerList
została usunięta z propozycji specyfikacji DOM3). Uruchom ten kod przed dołączeniem jakiegokolwiek zdarzenia:Przeczytaj wszystkie wydarzenia według:
I nie zapomnij zastąpić,
Element.removeEventListener
aby usunąć zdarzenie z niestandardowegoElement.eventListenerList
.3:
Element.onclick
nieruchomość wymaga tutaj szczególnej opieki:4: nie zapomnij
Element.onclick
atrybutu content: są to dwie różne rzeczy:Musisz więc sobie z tym poradzić:
Bookmarklet zdarzenia wizualnego (wspomniany w najpopularniejszej odpowiedzi) kradnie tylko pamięć podręczną procedury obsługi bibliotek:
Przesłanianie elementów może być wątpliwe (np. Ponieważ istnieją pewne funkcje specyficzne dla DOM, takie jak kolekcje na żywo, których nie można zakodować w JS), ale daje natywną obsługę eventListenerList i działa w Chrome, Firefox i Opera (nie działa w IE7 ).
źródło
Możesz owinąć natywne metody DOM do zarządzania detektorami zdarzeń, umieszczając to na górze
<head>
:H / T @ les2
źródło
Narzędzia programistyczne Firefoksa teraz to robią. Zdarzenia są wyświetlane po kliknięciu przycisku „ev” po prawej stronie wyświetlacza każdego elementu, w tym zdarzenia jQuery i DOM .
źródło
Jeśli masz Firebug , możesz użyć
console.dir(object or array)
do wydrukowania ładnego drzewa w dzienniku konsoli dowolnego skalaru JavaScript, tablicy lub obiektu.Próbować:
lub
źródło
W pełni działające rozwiązanie oparte na odpowiedzi Jana Turona - zachowuje się jak
getEventListeners()
z konsoli:(Jest mały błąd z duplikatami. I tak niewiele się psuje.)
Stosowanie:
someElement.getEventListeners([name])
- zwraca listę detektorów zdarzeń, jeśli nazwa jest ustawiona, zwraca tablicę detektorów dla tego zdarzeniasomeElement.clearEventListeners([name])
- usuń wszystkie detektory zdarzeń, jeśli nazwa jest ustawiona, usuń tylko detektory tego zdarzeniaźródło
body
idocument
.Opera 12 (nie najnowszy silnik Chrome Webkit) Dragonfly ma to od dłuższego czasu i jest oczywiście wyświetlane w strukturze DOM. Moim zdaniem jest to doskonały debugger i jest to jedyny powód, dla którego nadal używam wersji Opery 12 (nie ma wersji v13, v14, a wersja v15 Webkit wciąż nie ma Dragonfly)
źródło
Prototypowy sposób 1.7.1
źródło
Ostatnio pracowałem z wydarzeniami i chciałem wyświetlić / kontrolować wszystkie zdarzenia na stronie. Po przeanalizowaniu możliwych rozwiązań postanowiłem pójść własną drogą i stworzyć niestandardowy system monitorowania zdarzeń. Zrobiłem więc trzy rzeczy.
Po pierwsze potrzebowałem kontenera dla wszystkich detektorów zdarzeń na stronie: to jest
EventListeners
obiekt. Ma trzy użyteczne metody:add()
,remove()
, iget()
.Następnie stworzyłem
EventListener
obiekt do przechowywania informacji niezbędnych do zdarzenia, czyli:target
,type
,callback
,options
,useCapture
,wantsUntrusted
, i dodaje metodęremove()
usuwania słuchacza.Na koniec rozszerzyłem język macierzysty
addEventListener()
iremoveEventListener()
metody, aby działały z obiektami, które utworzyłem (EventListener
iEventListeners
).Stosowanie:
addEventListener()
tworzyEventListener
obiekt, dodaje goEventListeners
i zwracaEventListener
obiekt, aby można go było później usunąć.EventListeners.get()
można użyć do wyświetlenia słuchaczy na stronie. AkceptujeEventTarget
ciąg lub ciąg znaków (typ zdarzenia).Próbny
Powiedzmy, że chcemy poznać każdego detektora zdarzeń na bieżącej stronie. Możemy to zrobić (zakładając, że używasz rozszerzenia menedżera skryptów, w tym przypadku Tampermonkey). Następujący skrypt to robi:
A kiedy podajemy listę wszystkich słuchaczy, mówi się, że jest 299 słuchaczy zdarzeń. „Wydaje się”, że są jakieś duplikaty, ale nie wiem, czy naprawdę są duplikatami. Nie każdy typ zdarzenia jest duplikowany, więc wszystkie te „duplikaty” mogą być pojedynczymi detektorami.
Kod można znaleźć w moim repozytorium. Nie chciałem go tutaj zamieszczać, ponieważ jest raczej długi.
Aktualizacja: Wydaje się, że to nie działa z jQuery. Kiedy badam EventListener, widzę, że jest to wywołanie zwrotne
Uważam, że należy to do jQuery i nie jest rzeczywistym wywołaniem zwrotnym. jQuery przechowuje rzeczywiste wywołanie zwrotne we właściwościach EventTarget:
Aby usunąć detektor zdarzeń, faktyczne wywołanie zwrotne musi zostać przekazane do
removeEventListener()
metody. Aby więc działał z jQuery, wymaga dalszych modyfikacji. Mogę to naprawić w przyszłości.źródło
Próbuję to zrobić w jQuery 2.1, a
$().click() -> $(element).data("events").click;
metoda „ ” nie działa.Zrozumiałem, że w moim przypadku działają tylko funkcje $ ._ data ():
źródło
Istnieje ładne rozszerzenie jQuery Events :
( źródło tematu )
źródło
zmiana tych funkcji pozwoli ci zalogować dodane nasłuchiwania:
przeczytaj resztę słuchaczy
źródło