Jak znaleźć kod uruchamiany przez przycisk / element w Chrome za pomocą narzędzi programistycznych

[6]}używam Chrome i własnej strony internetowej.

Co wiem od wewnątrz:

1) mam formularz, w którym ludzie zapisują się klikając ten pomarańczowy przycisk obrazka:

Tutaj wpisz opis obrazka

2) sprawdzam to i to wszystko: <img class="formSend" src="images/botoninscribirse2.png">

3) w górnej części kodu źródłowego znajdują się Tony źródeł skryptów. z oczywiście, wiem, który przycisk dzwoni, zakodowałem go: <script src="js/jquery2.js" type="text/javascript"></script>

4) W tym pliku możesz find: $(".formSend").click(function() { ... }); co jest uruchamiane przez przycisk (aby zrobić dość złożoną walidację formularza i wyślij) i chcę być w stanie znaleźć to za pomocą narzędzi Chrome dev na dowolnej stronie.

Jak możemy dowiedzieć się, gdzie wywołuje element?


Karta słuchaczy nie działa dla mnie

Więc potem próbowałem szukać słuchaczy click event, co wydawało mi się bezpiecznym zakładem, ale... nie ma tam jquery2.js (a ja bym nie wiedział, który plik to kod więc bym trać czas na sprawdzanie tego...):

Tutaj wpisz opis obrazka

Moja $(".formSend").click(function() { ... }); funkcja w pliku jquery2.js nie istnieje.

Jesse wyjaśnia dlaczego w odpowiedzi:

"wreszcie, powodem, dla którego funkcja nie jest bezpośrednio powiązana z obsługą zdarzenia click jest to, że jQuery zwraca funkcję, która zostanie powiązana. funkcja jQuery z kolei przechodzi przez kilka warstw abstrakcji i sprawdza, a gdzieś tam, wykonuje swoje funkcja."

EDIT: zebrałem wszystkie metody, na które powstało to pytanie w jednej odpowiedzi poniżej, sugerowanej przez niektórych z was.

Author: Community, 2014-05-05

5 answers

Odpowiedź Alexandra Pavlova jest najbliższa temu, czego chcesz.

Ze względu na rozbudowę abstrakcji i funkcjonalności jQuery, wiele obręczy trzeba przeskoczyć, aby dostać się do mięsa zdarzenia. Ustawiłem ten jsFiddle , aby zademonstrować pracę.


1. Ustawianie punktu przerwania detektora zdarzeń

Byłeś blisko.
  1. Otwórz Chrome Dev Tools (F12) i przejdź do karty Źródła.
  2. Drill down do myszki - > kliknij
    Chrome Dev Tools -> Sources tab - > Mouse - > Click
    (Kliknij, aby powiększyć)

2. / Align = "left" /

Chrome Dev Tools wstrzyma wykonywanie skryptu i przedstawi Ci piękne Uwikłanie minifigurowanego kodu:

Chrome Dev Tools wstrzymało wykonanie skryptu (Kliknij aby powiększyć)


3. Znajdź wspaniały kod!

Sztuką jest, aby nie dać się ponieść naciskaniu klawisza i mieć oko na ekran.
  1. prasa klucz F11 (krok w) dopóki nie pojawi się żądany kod źródłowy
  2. kod źródłowy w końcu dotarł
    • w próbcejsFiddle podanej powyżej musiałem nacisnąć F11 108 czasy przed osiągnięciem żądanej funkcji / obsługi zdarzenia
    • Jeśli nie chcesz, aby Twoje dane były wyświetlane na twoim komputerze, kliknij przycisk "Zapisz".]}
    • z wystarczającym poświęceniem i czasem, możesz znaleźć dowolne wydarzenie handler / function

Żądana obsługa/funkcja zdarzenia


4. Wyjaśnienie

Nie mam dokładnej odpowiedzi ani wyjaśnienia, dlaczego jQuery przechodzi przez wiele warstw abstrakcji, które robi - wszystko, co mogę zasugerować, to to, że jest to spowodowane zadaniem, które wykonuje, aby abstrakcja z dala od przeglądarki wykonującej kod.

Oto jsFiddle z debugującą wersją jQuery (tzn. nie minifikowaną). Gdy spojrzysz na kod na pierwszym (nie-minified) breakpoint, widać, że kod obsługuje wiele rzeczy:

    // ...snip...

    if ( !(eventHandle = elemData.handle) ) {
        eventHandle = elemData.handle = function( e ) {
            // Discard the second event of a jQuery.event.trigger() and
            // when an event is called after a page has unloaded
            return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
                jQuery.event.dispatch.apply( elem, arguments ) : undefined;
        };
    }

    // ...snip...

Powodem, dla którego myślę, że przegapiłeś to podczas próby, gdy "wykonanie zatrzymuje się, a ja przeskakuję linia po linii", jest to, że mogłeś użyć funkcji "Step Over" zamiast "Step In". Oto odpowiedź StackOverflow wyjaśniająca różnice.

Wreszcie, powodem, dla którego twoja funkcja jest , a nie bezpośrednio związana z obsługą zdarzenia click jest to, że jQuery zwraca funkcja, która jest związana. funkcja jQuery z kolei przechodzi przez kilka warstw abstrakcji i sprawdza, a gdzieś tam wykonuje twoją funkcję.

 166
Author: Jesse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:42

Oto kilka rozwiązań:


Rozwiązanie 1 (działa świetnie, tylko trochę skonfigurowane, ale bez stron trzecich)

Frame blackboxing:

Tutaj wpisz opis obrazka

  1. Pop open Chrome Developer Tools ( F12 lub ++i) i przejdź do ustawień (w prawym górnym rogu lub F1 )
  2. po lewej stronie znajduje się zakładka "Blackboxing "
  3. i tu umieszczasz RegEx wzór plików, których chcesz uniknąć przechodzenia przez. Na przykład: jquery\..*\.js (human tłumaczenie: jquery.*.js)
  4. jeśli chcesz pominąć pliki z wieloma wzorami możesz dodać je za pomocą znaku rury w następujący sposób: jquery\..*\.js|include\.postload\.js. Lub po prostu dodawaj je za pomocą przycisku "Dodaj".
  5. teraz zastosuj roztwór 3 opisany poniżej.

Więcej na ten temat : https://developer.chrome.com/devtools/docs/blackboxing

Bonus tip : używam Regex101 , aby szybko przetestować moje zardzewiałe wzorce regex i dowiedzieć się, gdzie jestem w błędzie z debugerem regex krok po kroku. Są inni oczywiście.


Rozwiązanie 2 (działa świetnie i łatwo, ale musisz zainstalować rozszerzenie)

Zdarzenie Wizualne :

Tutaj wpisz opis obrazka

Osobisty ulubieniec. to działa wspaniale, ale jest to rozszerzenie, nie korzysta z narzędzi programistycznych Chrome. Tak dla twojej wiadomości.


Rozwiązanie 3 (trochę bolesne, ale łatwe)

  1. Otwieranie zakładki Dev Tools - > Sources i po prawej stronie Znajdowanie Event Listener Breakpoints:

    Tutaj wpisz opis obrazka

  2. Rozwiń Mouse i kliknij... cóż, click.

  3. teraz kliknij element (wykonanie powinno się zatrzymać) i tutaj rozpoczyna się gra: po prostu zacznij naciskać F11 (co jest krok w), aby przejść przez cały kod. Sit tight, może być masa skoków.
  4. prawdopodobnie będzie wiele skryptów, przez które nie chcesz / nie musisz się przeciągać, więc połącz to z metodą 1 opisaną powyżej.

Rozwiązanie 4 (tryb przetrwania)

I ' m always left with Ctr + Shift + F (wyszukiwanie tekstu we wszystkich źródłach) i wyszukiwanie #envio lub jakiegokolwiek znacznika / identyfikatora, który Twoim zdaniem rozpoczyna imprezę, czytanie wszystkich wyników, aby spróbować dowiedzieć się, jaki kod może być bieganie , poczucie przegranej i poczucie, że musi być bezpieczny sposób, aby naprawdę wiedzieć, co jest wyzwalane przez przycisk.

Ale pamiętaj, że czasami nie tylko img, ale i Tony divs nakładają się na siebie, a nawet nie wiesz, co uruchamia kod. Prawdopodobnie nie powinieneś używać tej metody.

 127
Author: Carles Alcolea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-07 23:46:19

Brzmi jak "...i przeskakuję linia po linii..." część jest zła. Czy StepOver lub StepIn i jesteś pewien, że nie przypadkowo przegapić odpowiedniego połączenia?

To powiedziawszy, debugowanie frameworków może być żmudne właśnie z tego powodu. Aby złagodzić ten problem, możesz włączyć eksperyment "włącz obsługę debugowania frameworków" . Miłego debugowania! :)

 14
Author: Alexander Pavlov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-06 08:45:31

Możesz użyć findHandlersJS

Możesz znaleźć obsługę wykonując w konsoli chrome:

findEventHandlers("click", "img.envio")

W konsoli chrome zostaną wydrukowane następujące informacje:

  • element
    Rzeczywisty element, w którym Obsługa zdarzenia została zarejestrowana w
  • wydarzenia
    Tablica z informacjami o procedurach obsługi zdarzeń jquery dla interesującego nas typu zdarzeń (np. click, change, etc)
  • handler
    Rzeczywista metoda obsługi zdarzeń, którą możesz zobaczyć klikając ją prawym przyciskiem myszy i wybierając Pokaż definicję funkcji
  • selektor
    Selektor przewidział delegowane zdarzenia. Będzie pusty dla bezpośrednich zdarzeń.
  • cele
    Lista z elementami, które ta Obsługa zdarzeń ma na celu. Na przykład, w przypadku delegowanej procedury obsługi zdarzeń zarejestrowanej w obiekcie document i skierowanej do wszystkich przycisków na stronie, Ta właściwość wyświetli wszystkie przyciski na stronie. Możesz je najechać i zobaczyć podświetlony w chromie.

Więcej informacji Proszę. i możesz spróbować na tej przykładowej stronie Proszę..

 6
Author: Rui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-06 09:55:52

To rozwiązanie wymaga metody danych jQuery .

  1. Otwórz konsolę Chrome (chociaż będzie działać każda przeglądarka z załadowanym jQuery)
  2. Run $._data($(".example").get(0), "events")
  3. wywierć wyjście, aby znaleźć żądaną obsługę zdarzeń.
  4. kliknij prawym przyciskiem myszy na "handler" i wybierz "Pokaż definicję funkcji"
  5. Kod zostanie wyświetlony w zakładce Sources

$._data() jest tylko dostęp do metody danych jQuery. Bardziej czytelną alternatywą może być jQuery._data().

Ciekawy punkt by this so answer :

Od jQuery 1.8 dane zdarzeń nie są już dostępne z" publicznego API " dla danych. Przeczytaj ten wpis na blogu jQuery . Powinieneś teraz użyć tego zamiast:

jQuery._data( elem, "events" ); elem powinien być elementem HTML, a nie obiekt jQuery, czyli selektor.

Należy pamiętać, że jest to struktura wewnętrzna, "prywatna" i nie powinno być modyfikowane. Użyj tego tylko do celów debugowania.

W starsze wersje jQuery, być może będziesz musiał użyć starej metody czyli:

jQuery( elem ).data( "events" );

Wersja jQuery to: (jQuery._data || jQuery.data)(elem, 'events');

 2
Author: apptaro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-05 02:21:13