Проверять прикрепленные обработчики событий на наличие любого элемента DOM

107

Есть ли способ просмотреть, какие функции / код прикреплены к любому событию для элемента DOM? Используя Firebug или любой другой инструмент.

Клаудио Реди
источник
Прикреплен с помощью jQuery или с использованием собственного DOM?
SLaks
3
@SLaks: Хороший вопрос. Прикреплено с использованием ЛЮБОГО механизма
Клаудио Реди

Ответы:

71

Обработчики событий, подключенные с использованием традиционного element.onclick= handlerили HTML-кода, <element onclick="handler">можно легко получить из element.onclickсвойства из сценария или встроенного отладчика.

Обработчики событий, подключенные с использованием addEventListenerметодов событий DOM уровня 2 и IE, в attachEventнастоящее время вообще не могут быть получены из сценария. DOM Level 3 когда-то предлагал element.eventListenerListполучить всех слушателей, но неясно, дойдет ли это до окончательной спецификации. Сегодня нет реализации ни в одном браузере.

Инструмент отладки в качестве расширения браузера может получить доступ к этим типам слушателей, но я не знаю ни одного, что действительно есть.

Некоторые JS-фреймворки оставляют достаточно записей о привязке событий, чтобы понять, чем они занимались. Visual Event использует этот подход для обнаружения слушателей, зарегистрированных через несколько популярных фреймворков.

бобинс
источник
7
Теперь есть расширение для Firebug под названием EventBug и, как сообщается, аналогичная функция в chrome / safari. Я также сделаю ссылку на более популярное обсуждение этого вопроса: stackoverflow.com/questions/446892/…
Николай
1
В Opera для этого можно использовать встроенную Opera Dragonfly.
Norill Tempest
Также есть встроенная часть в FireBug (расширение для FireFox) для событий, когда выбран тег HTML.
Муса Хайдари
EventBug интегрирован в FireBug начиная с версии 2 (теперь есть вкладка «События»).
Крис Рэй,
76

Панель элементов в инструментах разработчика Google Chrome имеет это с момента выпуска Chrome в середине 2011 года и выпусков канала разработчика Chrome с 2010 года.

Кроме того, прослушиватели событий, показанные для выбранного узла, находятся в том порядке, в котором они запускаются на этапах захвата и восходящей цепочки.

Нажмите command+ option+ iв Mac OSX и Ctrl+ Shift+ iв Windows, чтобы запустить это в Chrome.

скриншот инструментов разработчика

Tuxtitlan
источник
5
Как это делает панель элементов в Chrome?
thunderboltz
1
Кроме того, как мы можем найти код, который их назначает? Как только я нахожу подозрительный обработчик событий, использующий этот пользовательский интерфейс, панель становится недостаточно широкой, чтобы я мог видеть код обработчика ...
Стивен Лу
Я нахожу этот подход довольно запутанным ... по крайней мере, для меня. Когда я открыл событие, в нем есть только события jQuery, мое настраиваемое событие для этого конкретного элемента не отображается. Я использую данные $ ._ для пользовательских событий, которые я прикрепляю с помощью jQuery. См stackoverflow.com/questions/2008592/...
stack247
2
Можно ли просматривать события на windowобъекте, как и messageсобытие?
Септаграмма
8

Chrome Dev Tools недавно анонсировала несколько новых инструментов для мониторинга событий JavaScript .

TL; DR

Слушайте события определенного типа с помощью monitorEvents().

Используйте, unmonitorEvents()чтобы перестать слушать.

Получите слушателей элемента DOM, используя getEventListeners().

Используйте панель инспектора прослушивателей событий, чтобы получить информацию о прослушивателях событий.

Поиск пользовательских событий

Для моих нужд, обнаружения пользовательских событий JS в стороннем коде, следующие две версии getEventListeners()были чрезвычайно полезны;

  • getEventListeners(window)
  • getEventListeners(document)

Если вы знаете, к какому узлу DOM был прикреплен прослушиватель событий, вы бы передали это вместо windowили document.

Известное событие

Если вы знаете , какое событие вы хотите контролировать , например , clickна теле документа , вы можете использовать следующее: monitorEvents(document.body, 'click');.

Теперь вы должны начать видеть все события щелчка при document.bodyвходе в консоль.

GFargo
источник
Я пробовал это getEventListeners (document.getElementById ("inputId")); но он возвращает недопустимый, с размером массива 1
насыщенно-зеленый
6

Вы можете просмотреть непосредственно прикрепленные события (element.onclick = handler), посмотрев на DOM. Вы можете просматривать связанные с jQuery события в Firefox, используя FireBug с FireQuery. Похоже, что нет никакого способа увидеть события, добавленные addEventListener, с помощью FireBug. Однако вы можете увидеть их в Chrome с помощью отладчика Chrome.

mhenry1384
источник
6

Вы можете использовать Visual Event от Allan Jardine для проверки всех подключенных в данный момент обработчиков событий из нескольких основных библиотек JavaScript на вашей странице. Он работает с jQuery, YUI и некоторыми другими.

Visual Event - это букмарклет JavaScript, поэтому он совместим со всеми основными браузерами.

Медлок Перлман
источник
1

Вы можете расширить свою среду javascript, чтобы отслеживать слушателей событий. Оберните (или «перегрузите») собственный метод addEventListener () с помощью некоторого кода, который может вести запись о любом прослушивателе событий, добавленном с этого момента . Вам также придется расширить HTMLElement.prototype.removeEventListener, чтобы вести записи, которые точно отражают то, что происходит в DOM.

Просто ради иллюстрации (непроверенный код) - это пример того, как вы "оберните" addEventListener, чтобы иметь записи зарегистрированных прослушивателей событий на самом объекте:

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);
}
Рольф
источник