Sprawdź dołączone programy obsługi zdarzeń pod kątem dowolnego elementu DOM

107

Czy istnieje sposób, aby zobaczyć, jakie funkcje / kod są dołączone do dowolnego zdarzenia elementu DOM? Korzystanie z Firebuga lub innego narzędzia.

Claudio Redi
źródło
Dołączone za pomocą jQuery lub przy użyciu natywnego DOM?
SLaks
3
@SLaks: Dobre pytanie. Dołączone za pomocą DOWOLNEGO mechanizmu
Claudio Redi

Odpowiedzi:

71

Procedury obsługi zdarzeń dołączone przy użyciu tradycyjnego element.onclick= handlerlub HTML <element onclick="handler">można pobrać w prosty sposób z element.onclickwłaściwości ze skryptu lub w debugerze.

Programy obsługi zdarzeń dołączone przy użyciu metod DOM Level 2 Events addEventListeneri IE attachEventnie mogą być obecnie w ogóle pobierane ze skryptu. DOM Level 3 zaproponowano kiedyś, element.eventListenerListaby uzyskać dostęp do wszystkich słuchaczy, ale nie jest jasne, czy pozwoli to osiągnąć ostateczną specyfikację. Obecnie nie ma implementacji w żadnej przeglądarce.

Narzędzie do debugowania jako rozszerzenie przeglądarki może uzyskać dostęp do tego rodzaju słuchaczy, ale nie wiem, czy w rzeczywistości ma to miejsce.

Niektóre frameworki JS pozostawiają wystarczająco dużo zapisów powiązań zdarzeń, aby dowiedzieć się, co robili. Visual Event wykorzystuje to podejście do wykrywania słuchaczy zarejestrowanych za pomocą kilku popularnych frameworków.

bobince
źródło
7
Jest teraz rozszerzenie dla Firebug o nazwie EventBug i podobno podobna funkcja w chrome / safari. Podam również link do bardziej popularnej dyskusji na ten temat: stackoverflow.com/questions/446892/…
Nickolay
1
W Operze możesz użyć do tego wbudowanej Opera Dragonfly.
Norill Tempest
Istnieje również wbudowana część FireBug (rozszerzenie dla FireFox) dla zdarzeń po wybraniu tagu HTML.
Musa Haidari,
EventBug jest zintegrowany z FireBug od wersji 2 (jest teraz zakładka „Zdarzenia”).
Chris Rae,
76

Elementów płytowych w narzędziach Google Chrome Developer miał to od wydań Chrome w połowie 2011 roku i Chrome wydaniach kanale deweloperskim od 2010 roku.

Ponadto detektory zdarzeń pokazane dla wybranego węzła są w kolejności, w jakiej są uruchamiane w fazie przechwytywania i propagacji.

Naciśnij command+ option+ iw systemie Mac OSX i Ctrl+ Shift+ iw systemie Windows, aby uruchomić to w Chrome

zrzut ekranu narzędzi programistycznych

tuxtitlan
źródło
5
Jak działa panel elementów w Chrome?
thunderboltz
1
Jak też możemy znaleźć kod, który je przypisuje? Po znalezieniu podejrzanego programu obsługi zdarzeń za pomocą tego interfejsu użytkownika pasek nie jest wystarczająco szeroki, abym mógł zobaczyć kod modułu obsługi ...
Steven Lu
Uważam, że to podejście jest dość zagmatwane… przynajmniej dla mnie. Kiedy otworzyłem zdarzenie, ma tylko zdarzenia jQuery, moje zdarzenie niestandardowe dla tego konkretnego elementu nie jest wyświetlane. Używam danych $ ._ dla niestandardowych zdarzeń, które dołączam za pomocą jQuery. Zobacz stackoverflow.com/questions/2008592/…
stack247,
2
Czy można sprawdzić zdarzenia na windowobiekcie, takie jak messagezdarzenie?
Septagram
8

Narzędzia deweloperskie Chrome niedawno ogłosiły wprowadzenie nowych narzędzi do monitorowania zdarzeń JavaScript .

TL; DR

Słuchaj wydarzeń określonego typu za pomocą monitorEvents().

Służy unmonitorEvents()do przerywania słuchania.

Zdobądź odbiorców elementu DOM za pomocą getEventListeners().

Użyj panelu Inspektor nasłuchiwania zdarzeń, aby uzyskać informacje o odbiornikach zdarzeń.

Znajdowanie zdarzeń niestandardowych

Na moją potrzebę, odkrywając niestandardowe zdarzenia JS w kodzie strony trzeciej, poniższe dwie wersje getEventListeners()były niezwykle pomocne;

  • getEventListeners(window)
  • getEventListeners(document)

Jeśli wiesz, do którego węzła DOM został dołączony detektor zdarzeń, przekażesz to zamiast windowlub document.

Znane wydarzenie

Jeśli wiesz, co wydarzenie chcesz monitorować np clickna ciele dokumentu można użyć następujących: monitorEvents(document.body, 'click');.

Powinieneś teraz zacząć widzieć wszystkie zdarzenia kliknięcia na document.bodyzalogowanym w konsoli.

GFargo
źródło
Próbowałem thisgetEventListeners (document.getElementById ("inputId")); ale zwraca nieprawidłowy, z tablicą o rozmiarze 1
bogata zieleń
6

Możesz przeglądać bezpośrednio dołączone zdarzenia (element.onclick = handler), patrząc na DOM. Możesz przeglądać zdarzenia dołączone do jQuery w Firefoksie za pomocą FireBug z FireQuery. Wygląda na to, że nie ma sposobu, aby zobaczyć zdarzenia dodane przez addEventListener za pomocą FireBug. Możesz je jednak zobaczyć w Chrome za pomocą debugera Chrome.

mhenry1384
źródło
6

Możesz użyć Visual Event autorstwa Allana Jardine'a, aby sprawdzić wszystkie aktualnie dołączone programy obsługi zdarzeń z kilku głównych bibliotek JavaScript na twojej stronie. Działa z jQuery, YUI i kilkoma innymi.

Visual Event to bookmarklet JavaScript, więc jest kompatybilny ze wszystkimi głównymi przeglądarkami.

Medlock Perlman
źródło
1

Możesz rozszerzyć swoje środowisko javascript, aby śledzić detektory zdarzeń. Otocz (lub „przeciąż”) natywną metodę addEventListener () jakimś kodem, który może przechowywać zapis każdego detektora zdarzeń dodanego od tego momentu . Musiałbyś również rozszerzyć HTMLElement.prototype.removeEventListener, aby przechowywać rekordy, które dokładnie odzwierciedlają to, co dzieje się w DOM.

Dla ilustracji (nieprzetestowany kod) - to jest przykład tego, jak można `` opakować '' addEventListener, aby zapisy zarejestrowanych detektorów zdarzeń znajdowały się na samym obiekcie:

var nativeMethod = HTMLElement.prototype.addEventListener;
HTMLElement.prototype.addEventListener = function (type, listener) {
   var el = e.currentTarget;
   if(!(el.eventListeners instanceof Array)) { el.eventListeners = []}
   el.eventListeners.push({'type':type, 'listener':listener});
   nativeMethod.call(el, type, listener);
}
Rolf
źródło