Как узнать, какой код запускается кнопкой/элементом в Chrome с помощью инструментов разработчика
Я использую Chrome и собственный сайт.
Что я знаю изнутри:
1) У меня есть форма, где люди регистрируются, нажав эту оранжевую кнопку изображения:
![enter image description here]()
2) Я проверяю его, и это все, что он:
<img class="formSend" src="images/botoninscribirse2.png">
3). В верхней части исходного кода есть тонны источников script. Из Конечно, я знаю, какую кнопку вызывает, я закодировал ее: <script src="js/jquery2.js" type="text/javascript"></script>
4). В этом файле вы можете найти: $(".formSend").click(function() { ... });
то, что запускается кнопкой (для выполнения довольно сложной проверки и отправки формы) и , что я хочу чтобы найти, используя инструменты chrome dev на любом веб-сайте.
Как узнать, где вызов элемента?
Вкладка "Слушатели" не работала для меня
Итак, я попробовал посмотреть прослушиватели событий кликов, которые казались мне безопасной ставкой, но... там нет jquery2.js
(и я бы не знал, в каком файле код, так что я буду тратить время проверки всех этих...):
![enter image description here]()
Моя $(".formSend").click(function() { ... });
функция в файле jquery2.js
отсутствует.
Jesse объясняет почему в своем ответе:
"Наконец, причина, по которой ваша функция напрямую не связана с обработчиком событий click, заключается в том, что jQuery возвращает функцию, которая привязана. Функция jQuery, в свою очередь, проходит через некоторые уровни абстракции и проверок, а где-то там, функция".
EDIT: Я собрал все методы, которые этот вопрос возник в в одном ответе ниже, как это было предложено некоторыми из вас. p >
Ответы
Ответ 1
Решение 1. Фреймворк для чёрного ящика
Прекрасно работает, минимальная настройка и отсутствие третьих лиц.
Согласно документации Chrome:
Что происходит, когда вы включаете скрипт в черный ящик?
Исключения, выданные из кода библиотеки , не будут приостанавливаться (если Пауза включена) исключения включены), вход в/из/в обход библиотеки код, точки останова прослушивателя событий не ломаются в коде библиотеки, отладчик не будет останавливаться на любых точках останова, установленных в коде библиотеки. конечный результат - вы отлаживаете код своего приложения вместо третьего партийные ресурсы.
Вот обновленный рабочий процесс:
- Откройте Chrome Developer Tools (F12 или ⌘ + ⌥ + i), перейдите в настройки (вверху справа или F1). Найдите вкладку слева под названием "Черный ящик"
![enter image description here]()
- Здесь вы помещаете шаблон RegEx файлов, которые Chrome должен игнорировать при отладке. Например:
jquery\..*\.js
(глобус/перевод человека: jquery.*.js
)
- Если вы хотите пропустить файлы с несколькими шаблонами, вы можете добавить их, используя символ канала
|
, например так: jquery\..*\.js|include\.postload\.js
(который действует как "или этот шаблон", так сказать. продолжайте добавлять их с помощью кнопки "Добавить".
- Теперь перейдите к Решению 3, описанному ниже.
Бонусный совет! Я регулярно использую Regex101 (но есть много других:), чтобы быстро проверить мои ржавые шаблоны регулярных выражений и выяснить, в чем я не прав с пошаговым отладчиком регулярных выражений. Если вы еще не "хорошо владеете" регулярными выражениями, я рекомендую вам начать использовать сайты, которые помогают вам писать и визуализировать их, такие как http://buildregex.com/ и https://www.debuggex.com/
Вы также можете использовать контекстное меню при работе на панели источников. При просмотре файла вы можете щелкнуть правой кнопкой мыши в редакторе и выбрать Blackbox Script. Это добавит файл в список на панели "Настройки":
![enter image description here]()
Решение 2. Визуальное событие
![enter image description here]()
Это отличный инструмент для:
Visual Event - это Javascript bookmarklet с открытым исходным кодом, который обеспечивает отладочная информация о событиях, которые были прикреплены к DOM элементы. Визуальное событие показывает:
- К каким элементам прикреплены события
- Тип событий, прикрепленных к элементу
- Код, который будет запущен вместе с событием, сработал
- Исходный файл и номер строки, в которой была определена присоединенная функция (только для браузеров Webkit и Opera)
Решение 3. Отладка
Вы можете приостановить код, когда щелкаете где-нибудь на странице или когда изменяется DOM... и другие виды точек останова JS, которые будет полезно знать. Вы должны применить черный ящик здесь, чтобы избежать кошмара.
В этом случае я хочу знать, что именно происходит, когда я нажимаю кнопку.
Откройте Dev Tools → вкладку Sources и справа найдите Event
Listener Breakpoints
:
![enter image description here]()
Разверните Mouse
и выберите click
- Теперь щелкните элемент (выполнение должно быть приостановлено), и теперь вы отлаживаете код. Вы можете пройти по всему коду, нажав F11 (который входит в систему). Или вернитесь на несколько прыжков в стеке. Там может быть тонна прыжков
Решение 4: ключевые слова для рыбалки
С активированными Dev Tools вы можете искать всю кодовую базу (весь код во всех файлах) с помощью ⌘ + ⌥ + F или:
![enter image description here]()
и поиск #envio
или любого другого тега/класса/идентификатора, который, по вашему мнению, начинает вечеринку, и вы можете добраться куда-то быстрее, чем предполагалось.
Имейте в виду, что иногда там находится не только img
, но и множество элементов, и вы можете не знать, какой из них вызывает код.
Если вам это немного не по вкусу, посмотрите учебник по отладке Chrome.
Ответ 2
Ответ Александра Павлова ближе всего подходит к тому, что вы хотите.
Из-за экстенсивности jQuery-абстракции и функциональности много обручей нужно подпрыгнуть, чтобы добраться до мяса события. Я продемонстрировал эту jsFiddle.
1. Настройка контрольной точки прослушивателя событий
Ты был близок к этому.
- Откройте Chrome Dev Tools (F12) и перейдите на вкладку "Источники".
- Прокрутите до мыши → Нажмите кнопку
< ш > (нажмите, чтобы увеличить)
2. Нажмите кнопку!
Chrome Dev Tools приостанавливает выполнение script и представляет вам эту красивую запутанность мини-кода:
(нажмите, чтобы увеличить)
3. Найдите славный код!
Теперь трюк здесь - не увлекаться нажатием клавиши и следить за ним на экране.
- Нажмите клавишу F11 (Step In), пока не появится нужный исходный код
- Окончательный исходный код
- В приведенном выше примере jsFiddle мне пришлось нажать F11 108 раз, прежде чем желаемый обработчик/функция события
- Ваш пробег может варьироваться в зависимости от версии jQuery (или библиотеки фреймворка), используемой для привязки событий
- С достаточной отдачей и временем вы можете найти любой обработчик/функцию события
![Желаемый обработчик/функция события]()
4. Объяснение
У меня нет точного ответа или объяснения относительно того, почему jQuery проходит через многие слои абстракций, которые он делает - все, что я могу предположить, состоит в том, что это связано с тем, что он делает, чтобы отвлечь свое использование от браузера выполнение кода.
Вот jsFiddle с отладочной версией jQuery (т.е. не минимизированной). Когда вы смотрите на код на первой (неминифицированной) точке останова, вы можете видеть, что код обрабатывает много вещей:
// ...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...
Причина, по которой я думаю, что вы пропустили ее при попытке, когда "выполнение приостанавливается и я прыгаю по строчке", заключается в том, что вы, возможно, использовали функцию "Step Over" вместо Step In. Вот ответ fooobar.com/questions/30983/..., объясняющий различия.
Наконец, причина, по которой ваша функция напрямую не связана с обработчиком событий click, заключается в том, что jQuery возвращает связанную функцию. Функция jQuery, в свою очередь, проходит через некоторые уровни абстракции и проверки, и где-то там, она выполняет вашу функцию.
Ответ 3
Звучит как "... и я прыгаю по строчке..." часть ошибочна. Вы StepOver или StepIn, и вы уверены, что не случайно пропустили соответствующий звонок?
Тем не менее, отладка фреймворков может быть утомительной именно по этой причине. Чтобы устранить проблему, вы можете включить эксперимент "Включить поддержку отладки фреймворков" . Счастливая отладка!:)
Ответ 4
Вы можете использовать findHandlersJS
Вы можете найти обработчик, выполнив его в консоли хром:
findEventHandlers("click", "img.envio")
Вы получите следующую информацию, напечатанную в консоли хром:
- элемент
Фактический элемент, в котором обработчик событий был зарегистрирован в
- события
Массив с информацией о обработчиках событий jquery для интересующего типа события (например, щелчок, изменение и т.д.)
- Обработчик
Фактический метод обработчика событий, который вы можете увидеть, щелкнув его правой кнопкой мыши и выбрав "Показать определение функции"
-
селекторного
Селектор предоставил делегированные события. Он будет пуст для прямых событий.
- цели
Список с элементами, для которых нацелен этот обработчик событий. Например, для делегированного обработчика событий, который зарегистрирован в объекте документа и предназначен для всех кнопок на странице, это свойство отобразит все кнопки на странице. Вы можете навести их на них и увидеть, что они выделены хром.
Подробнее здесь, и вы можете попробовать его в этом примере сайта здесь.
Ответ 5
Для этого решения требуется метод данных jQuery.
- Откройте консоль Chrome (хотя любой браузер с загруженным jQuery будет работать)
- Выполнить
$._data($(".example").get(0), "events")
- Разверните вывод, чтобы найти нужный обработчик событий.
- Щелкните правой кнопкой мыши на "обработчик" и выберите "Показать определение функции"
- Код будет отображаться на вкладке Источники
$._data()
- это просто доступ к методу данных jQuery. Более читаемой альтернативой может быть jQuery._data()
.
Интересный пункт this SO answer:
Как и в jQuery 1.8, данные события больше не доступный из "общедоступного API" для данных. Прочитайте этот пост в блоге jQuery. Теперь вы должны использовать это:
jQuery._data( elem, "events" );
Элем должен быть элементом HTML, а не jQuery или селектор.
Обратите внимание, что это внутренняя структура 'private' и не следует изменять. Используйте это только для целей отладки.
В более старых версиях jQuery вам может понадобиться использовать старый метод который:
jQuery( elem ).data( "events" );
Агностическая версия jQuery будет следующей: (jQuery._data || jQuery.data)(elem, 'events');