attachEvent或addEventListener – 存储在哪里?

在JQuery中,如果我这样做……

$('a').click(function(){ // Do something }); 

… click事件存储在$('a').data('events') ,我可以像这样获取它:

 jQuery.each($('a').data('events'), function(i, event){ jQuery.each(event, function(i, handler){ if(handler.type.toString() == 'click') { // do something } }); }); 

通过attachEventaddEventListener附加的事件显然不会出现在$('a').data('events') 。 有什么我可以迭代它的位置? 我猜他们在某个地方排队,但我找不到文件指出我正确的方向。

如果您可以在页面开头安装代码,则可以使用这种钩子在您自己的数据结构中记录所有后续侦听器: 为什么Google +1会记录我的鼠标移动? 。

我知道无法访问现有的侦听器。

从quirksmode :

当前实现W3C事件注册模型的一个问题是,您无法确定是否已向元素注册任何事件处理程序。 在传统模型中,您可以:

 alert(element.onclick) 

并且您会看到已注册的function,或者未注册任何内容时未定义的function。 仅在最近的DOM Level 3事件中, W3C添加了一个eventListenerList来存储当前在元素上注册的事件处理程序列表。 任何浏览器都不支持此function,它太新了。 但是,问题已得到解决。

 // Introduced in DOM Level 2: interface EventTarget { void addEventListener(in DOMString type, in EventListener listener, in boolean useCapture); void removeEventListener(in DOMString type, in EventListener listener, in boolean useCapture); boolean dispatchEvent(in Event evt) raises(EventException); // Introduced in DOM Level 3: readonly attribute EventListenerList eventListeners; }; 

所以el.eventListeners包含使用el.addEventListener附加到el所有事件侦听el.addEventListener

您需要使用填充程序来处理浏览器支持。 目前Chrome 12和Firefox 5不支持此function