7

我正在寻找这个问题的更新答案。

似乎在 Prototype 1.6+ 中不再使用 Event.observers(也许是为了避免内存泄漏),那么我现在如何追踪哪些事件侦听器附加到元素?

我知道 Firebug 有一个“下一个中断”按钮,但是在我可以在另一个特定元素上获得我想要的行为之前,body 元素上有几个鼠标侦听器会执行,那么还有其他方法吗?

4

2 回答 2

7

事情现在通过元素存储路由:)

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.

请注意,这些是未记录的内部细节,将来可能会更改,所以我不会依赖它们,也许除了调试目的。

于 2009-09-14T17:42:23.683 回答
7

我已经更新了您链接到的答案,其中包含更全面Prototype的覆盖范围,以考虑1.6.01.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!') }"
})
于 2009-09-14T18:17:05.267 回答