Доступ к функциям, связанным с обработчиками событий с помощью 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, в правой части выберите "Слушатели событий".