Как отлаживать привязки событий JavaScript/jQuery к Firebug или аналогичным инструментам?

Мне нужно отлаживать веб-приложение, которое использует jQuery для выполнения довольно сложной и беспорядочной DOM. В какой-то момент некоторые из событий, связанных с конкретными элементами, не запускаются и просто перестают работать.

Если бы у меня была возможность редактировать источник приложения, я бы развернул и добавил кучу Firebug console.log() операторов и комментировать/раскомментировать фрагменты кода, чтобы попытаться определить проблему. Но допустим, что я не могу редактировать код приложения и должен полностью работать в Firefox с помощью Firebug или подобных инструментов.

Firebug очень хорош, позволяя мне перемещаться и манипулировать DOM. Пока, однако, я не смог понять, как выполнить отладку событий с помощью Firebug. В частности, я просто хочу увидеть список обработчиков событий, привязанных к определенному элементу в данный момент времени (используя контрольные точки Firebug JavaScript для отслеживания изменений). Но у Firebug нет возможности видеть связанные события, или я слишком тупой, чтобы найти его.: -)

Любые рекомендации или идеи? В идеале я просто хотел бы видеть и редактировать события, связанные с элементами, подобно тому, как я могу редактировать DOM сегодня.

Ответ 1

Смотрите Как найти прослушиватели событий на DOM node.

В двух словах, предположив, что в какой-то момент к вашему элементу прикреплен обработчик событий (например): $('#foo').click(function() { console.log('clicked!') });

Вы проверяете его так:

  • jQuery 1.3.x

    var clickEvents = $('#foo').data("events").click;
    jQuery.each(clickEvents, function(key, value) {
      console.log(value) // prints "function() { console.log('clicked!') }"
    })
    
  • jQuery 1.4.x

    var clickEvents = $('#foo').data("events").click;
    jQuery.each(clickEvents, function(key, handlerObj) {
      console.log(handlerObj.handler) // prints "function() { console.log('clicked!') }"
    })
    

См. jQuery.fn.data (где jQuery хранит ваш обработчик внутри себя).

  • jQuery 1.8.x

    var clickEvents = $._data($('#foo')[0], "events").click;
    jQuery.each(clickEvents, function(key, handlerObj) {
      console.log(handlerObj.handler) // prints "function() { console.log('clicked!') }"
    })
    

Ответ 2

Там есть хороший букмарклет с именем Visual Event, который может показать вам все события, связанные с элементом. Он имеет цветные подсветки для различных типов событий (мышь, клавиатура и т.д.). Когда вы наводите на них курсор, он показывает тело обработчика события, его привязку и номер файла/строки (в WebKit и Opera). Вы также можете запустить событие вручную.

Он не может найти каждое событие, потому что нет стандартного способа поиска того, какие обработчики событий привязаны к элементу, но он работает с такими популярными библиотеками, как jQuery, Prototype, MooTools, YUI и т.д.

Ответ 4

Вы можете использовать FireQuery. Он показывает любые события, связанные с элементами DOM на вкладке HTML Firebug. Он также показывает любые данные, прикрепленные к элементам через $.data.

Ответ 5

Здесь есть плагин, который может перечислять все обработчики событий для любого данного элемента/события:

$.fn.listHandlers = function(events, outputFunction) {
    return this.each(function(i){
        var elem = this,
            dEvents = $(this).data('events');
        if (!dEvents) {return;}
        $.each(dEvents, function(name, handler){
            if((new RegExp('^(' + (events === '*' ? '.+' : events.replace(',','|').replace(/^on/i,'')) + ')$' ,'i')).test(name)) {
               $.each(handler, function(i,handler){
                   outputFunction(elem, '\n' + i + ': [' + name + '] : ' + handler );
               });
           }
        });
    });
};

Используйте его следующим образом:

// List all onclick handlers of all anchor elements:
$('a').listHandlers('onclick', console.info);

// List all handlers for all events of all elements:
$('*').listHandlers('*', console.info);

// Write a custom output function:
$('#whatever').listHandlers('click',function(element,data){
    $('body').prepend('<br />' + element.nodeName + ': <br /><pre>' + data + '<\/pre>');
});

Src: (мой блог) → http://james.padolsey.com/javascript/debug-jquery-events-with-listhandlers/

Ответ 7

Используйте $._data(htmlElement, "events") в jquery 1.7 +;

Пример:

$._data(document, "events") или $._data($('.class_name').get(0), "events")

Ответ 8

Как сказал коллега, console.log > alert:

var clickEvents = $('#foo').data("events").click;
jQuery.each(clickEvents, function(key, value) {
    console.log(value);
})

Ответ 9

jQuery хранит события в следующем:

$("a#somefoo").data("events")

Выполнение console.log($("a#somefoo").data("events")) должно содержать список событий, связанных с этим элементом.

Ответ 10

Используя DevTools в последнем Chrome (v29), я нахожу эти два совета очень полезными для отладки событий:

  1. Список событий jQuery для последнего выбранного элемента DOM

    • Осмотреть элемент на странице
    • введите в консоли следующее:

      $._ data ($ 0, "events")//принятие jQuery 1. 7+

    • Он будет перечислять все связанные с ним объекты событий jQuery, развернуть интересующее событие, щелкнуть правой кнопкой мыши по функции свойства "обработчик" и выбрать "Показать определение функции". Он откроет файл, содержащий указанную функцию.
  2. Использование команды monitorEvents()

Ответ 11

Похоже, команда FireBug работает над расширением EventBug. Он добавит еще одну панель в FireBug - Events.

"Панель событий отобразит все обработчики событий на странице, сгруппированной по типу события. Для каждого типа события вы можете открыть, чтобы увидеть элементы, к которым привязаны слушатели, и сводка источника функции." EventBug Rising

Хотя они не могут сказать прямо сейчас, когда он будет выпущен.

Ответ 12

Я также нашел jQuery Debugger в хранилище хрома. Вы можете щелкнуть элемент dom и показать все связанные с ним события вместе с функцией обратного вызова. Я отлаживал приложение, в котором события не удалялись должным образом, и это помогло мне отслеживать его за считанные минуты. Очевидно, это для хром, но не для firefox.

Ответ 13

значок ev рядом с элементами

В панели "Инспектор инструментов разработчика Firefox" перечислены все события, связанные с элементом.

Сначала выберите элемент с помощью Ctrl + Shift + C, например, стрелка.

Нажмите значок ev справа от элемента и откроется диалог:

events tooltip

Нажмите на знак паузы || символ для желаемого события, и это открывает отладчик в строке обработчика.

Теперь вы можете разместить точку останова, как обычно, в отладчике, щелкнув левое поле линии.

Это упоминается в: https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Examine_event_listeners

К сожалению, я не мог найти способ, чтобы это играло красиво с прелестью, оно просто открывается на мини-линии: как украсить Javascript и CSS в Firefox/Firebug?

Протестировано на Firefox 42.

Ответ 14

Согласно этот поток, в Firebug нет способа посмотреть, какие события подключены к слушателям на Элемент DOM.

Похоже, что лучшее, что вы можете сделать, это то, что предлагает tj111, или вы можете щелкнуть правой кнопкой мыши элемент в средстве просмотра HTML и нажать "Log Events", чтобы вы могли видеть, какие события запускаются для определенного элемента DOM. Я полагаю, что можно было бы это сделать, чтобы узнать, какие события могут увольнять определенные функции.

Ответ 15

С версией 2.0 Firebug представила панель событий, в которой перечислены все события для элемента, выбранного в данный момент в HTML-панель.

* События * боковая панель в Firebug

Он также может отображать прослушиватели событий, завернутые в привязки событий jQuery, в случае проверки опции Show Wrapped Listeners, с которой вы можете связаться с помощью меню параметров панели событий.

С этой панелью рабочий процесс для отладки обработчика событий выглядит следующим образом:

  • Выберите элемент с прослушивателем событий, который вы хотите отлаживать
  • Внутри боковой панели "События" щелкните правой кнопкой мыши функцию в соответствующем событии и выберите "Установить точку останова"
  • Запустить событие

= > Выполнение script останавливается в первой строке функции обработчика событий, и вы можете его отладить.

Ответ 16

Firebug 2 теперь включает отладку/проверку DOM-событий.