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

Учет списков утечки управляющей переменной цикла в Python 2, но не в Python 3. Вот Guido van Rossum (создатель Python) , объясняющий историю этого:

Мы также внесли еще одно изменение в Python 3, чтобы улучшить эквивалентность между пониманиями списков и выражений генератора. В Python 2, понимание списка «утечки» переменной управления циклом в окружающую область:

x = 'before'
a = [x for x in 1, 2, 3]
print x # this prints '3', not 'before'

Это был артефакт первоначальной реализации понимания списков; это был один из «грязных маленьких секретов» Питона в течение многих лет. Это началось как преднамеренный компромисс, чтобы сделать переписные слова ослепительно быстрыми, и, хотя это не было обычной ловушкой для начинающих, это определенно ужалило людей изредка. Для выражений генератора мы не могли этого сделать. Выражения генератора реализуются с использованием генераторов, выполнение которых требует отдельного кадра выполнения. Таким образом, выражения генератора (особенно, если они повторяются по короткой последовательности) были менее эффективны, чем понимание списков.

Однако в Python 3 мы решили исправить «грязный маленький секрет» из понятий списка, используя та же стратегия реализации, что и для выражений генератора. Таким образом, в Python 3 приведенный выше пример (после модификации использования print (x) :-) будет печатать «before», доказывая, что «x» в понимании списка временно затеняет, но не переопределяет «x» в окружающем область.

blockquote>

600
задан Ciro Santilli 新疆改造中心996ICU六四事件 24 May 2018 в 09:28
поделиться

9 ответов

См. , Как найти слушателей события на узле DOM .

, Короче говоря принимая в какой-то момент обработчик событий присоединен к Вашему элементу (например): $('#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!') }"
    })
    
353
ответ дан Community 24 May 2018 в 19:28
поделиться
  • 1
    @rslite, учитывая эффективность сопроцессоров для операций с плавающей точкой в центральных процессорах в эти дни, вероятно, что это было бы более быстро, чтобы позволить FPU сделать умножение, вместо того, чтобы делать целочисленное дополнение только к части number' s набор битов. – David Arno 24 October 2008 в 20:20

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

$.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,'')) + ') 

Использование это как это:

// 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/

,'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/

26
ответ дан James 24 May 2018 в 19:28
поделиться
  • 1
    @James: Заметьте на той ссылке, я отправил VC 7, делает значительный лучше, чем VC 6. – J.J. 24 October 2008 в 20:59

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

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

3
ответ дан Daniel Lew 24 May 2018 в 19:28
поделиться

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

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

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

6
ответ дан bluish 24 May 2018 в 19:28
поделиться

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

Это не может найти каждое событие, потому что нет никакого стандартного способа искать, какие обработчики событий присоединены к элементу, но это работает с популярными библиотеками как jQuery, Прототип, MooTools, YUI, и т.д.

162
ответ дан Matthew Crumley 24 May 2018 в 19:28
поделиться

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

41
ответ дан 22 November 2019 в 22:00
поделиться

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

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

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

4
ответ дан 22 November 2019 в 22:00
поделиться

Как предложил коллега, console.log> alert:

var clickEvents = $('#foo').data("events").click;
jQuery.each(clickEvents, function(key, value) {
    console.log(value);
})
8
ответ дан 22 November 2019 в 22:00
поделиться

Консоль разработчика WebKit (в Chrome, Safari и т. Д.) Позволяет просматривать присоединенные события для элементов.

Более подробно в этом вопросе о переполнении стека

23
ответ дан 22 November 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: