attachEvent或addEventListener - 存储在哪里?

时间:2011-07-31 00:32:53

标签: javascript jquery events javascript-events

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

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

...点击事件存储在$('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')中。有什么我可以迭代它的位置?我猜他们在某个地方排队,但我找不到文件指出我正确的方向。

3 个答案:

答案 0 :(得分:4)

来自quirksmode

  

当前实施W3C事件注册的一个问题   model是你无法找出是否已经有任何事件处理程序   注册到元素。在传统模型中,你可以做到:

alert(element.onclick)
     

你会看到注册到它的函数,或者是否为undefined   没有注册。仅在最近的DOM Level 3 Events W3C中   添加一个eventListenerList来存储事件处理程序列表   目前在元素上注册。此功能尚未实现   任何浏览器都支持它,它太新了。但是,问题一直存在   寻址。

答案 1 :(得分:2)

如果您可以在页面开头安装代码,则可以使用此类挂钩在您自己的数据结构中记录所有后续侦听器:Why does Google +1 record my mouse movements?

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

答案 2 :(得分:1)

// 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附加到el.addEventListener的所有事件监听器。

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