Доступ к функциям, связанным с обработчиками событий с помощью jQuery

С помощью jQuery вы можете связывать функции с событием, инициированным на объекте DOM, с помощью .bind() или одной из вспомогательных функций обработчика событий.

jQuery должен каким-то образом сохранить это внутренне, и мне интересно, возможно ли это с помощью объекта DOM, чтобы выяснить, какие события связаны с объектом, и получить доступ к этим функциям и т.д. Желаемый результат возврата может выглядеть примерно так:

{
  click: [function1, function2],
  change: [function3],
  blur: [function4, function5, function6]
}

Ответ 1

Изменить: приведенный ниже метод работает только в jQuery < 1.7

В этой статье вы найдете много интересных советов и трюков: Что вы можете не знать о jQuery.

Кажется, что jQuery использует data для хранения обработчиков событий:

Доступ ко всем обработчикам событий связанный с элементом (или любым объектом) через хранилище событий jQuerys:

// List bound events:
console.dir( jQuery('#elem').data('events') );

// Log ALL handlers for ALL events:
jQuery.each($('#elem').data('events'), function(i, event){
    jQuery.each(event, function(i, handler){
        console.log( handler['handler'].toString() );
    });
});

// You can see the actual functions which will occur
// on certain events; great for debugging!

Ответ 2

jQuery 1.7 остановил отображение событий в функции регулярных данных(). Вы все равно можете получить их так:

var elem = $('#someid')[0];
var data = jQuery.hasData( elem ) && jQuery._data( elem );
console.log(data.events);

Обратите внимание, что это работает только для событий, которые были связаны с использованием jQuery. AFAIK вы не можете увидеть все события, которые были связаны с помощью обычных функций DOM, таких как addEventListener.

Вы можете увидеть их в инспекторе webkit, хотя: На вкладке "Элементы" перейдите к нужному DOM node, в правой части выберите "Слушатели событий".