Обновление: Как найти слушателей событий на узле DOM в прототипе? - PullRequest
6 голосов
/ 14 сентября 2009

Я ищу обновленный ответ на этот вопрос .

Кажется, что Event.observers больше не используется (возможно, чтобы избежать утечек памяти) в Prototype 1.6+, так как мне теперь отследить, какие прослушиватели событий подключены к элементу?

Я знаю, что у Firebug есть кнопка "break on next", но есть несколько прослушивателей мыши на элементе body, которые выполняются, прежде чем я доберусь до нужного мне поведения на другом конкретном элементе, так есть ли какой-то другой способ?

Ответы [ 2 ]

7 голосов
/ 14 сентября 2009

Я обновил ответ , на который вы ссылались с более полным Prototype покрытием, учитывающим изменения в версиях 1.6.0 до 1.6.1.

Там было очень грязно, но 1.6.1 несколько чист:

var handler = function() { alert('clicked!') };
$(element).observe('click', handler);

// inspect
var clickEvents = element.getStorage().get('prototype_event_registry').get('click');
clickEvents.each(function(wrapper){
    alert(wrapper.handler) // alerts "function() { alert('clicked!') }"
})
6 голосов
/ 14 сентября 2009

Вещи теперь маршрутизируются через хранилище элементов:)

Element.getStorage(yourElement).get('prototype_event_registry') даст вам экземпляр прототипа Hash, так что вы можете делать все, что вы делаете с хешем.

// to see which event types are being observed
Element.getStorage(yourElement).get('prototype_event_registry').keys();

// to get array of handlers for particular event type
Element.getStorage(yourElement).get('prototype_event_registry').get('click');

// to get array of all handlers
Element.getStorage(yourElement).get('prototype_event_registry').values();

// etc.

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

...