【问题标题】:attachEvent or addEventListener - stored where?attachEvent 或 addEventListener - 存储在哪里?
【发布时间】:2011-10-16 17:44:07
【问题描述】:

在 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') 中。有什么我可以迭代它的地方吗?我假设他们在某个地方排队,但我找不到文件来为我指明正确的方向。

【问题讨论】:

  • 您无法访问该信息
  • 很抱歉不相信您开箱即用,但如果您有一些文件来支持该声明,我将不胜感激。

标签: javascript jquery events javascript-events


【解决方案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.addEventListener 附加到el 的所有事件侦听器。

您需要使用 shim 来处理浏览器支持。目前 Chrome 12 和 Firefox 5 不支持此功能

【讨论】:

  • 多么蹩脚。认真使用 JQuery 的另一个理由。
  • @AlienWebGuy 不是使用 jQuery 的理由。这是使用跨浏览器 polyfill 的原因。 jQuery 是一种特殊的 polyfill(而且相当平庸)
  • 与大众意见相矛盾的大胆声明。那你推荐什么 polyfill?
【解决方案2】:

来自quirksmode

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

alert(element.onclick)

你会看到注册到它的函数,或者 undefined if 什么都没有注册。仅在其最近的DOM Level 3 Events W3C 添加一个 eventListenerList 来存储事件处理程序的列表,这些事件处理程序是 当前注册在一个元素上。这个功能还没有 任何浏览器都支持,太新了。然而,问题已经 解决。

【讨论】:

  • 那是古老的。 DOM Level 3 事件是从 2002 年开始的。2002 年的“任何浏览器都不支持”是......好吧 IE7 在 2006 年问世,看看我们已经走了多远。
  • @AlienWebGuy 即使浏览器不支持它。
【解决方案3】:

如果你可以在页面开头安装代码,你可以用这种钩子将所有后续的监听器记录在你自己的数据结构中:Why does Google +1 record my mouse movements?

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

【讨论】:

  • 这看起来很有前途!
  • 这个周末我要去测试 - 我没有忘记这个想法 :)
猜你喜欢
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
相关资源
最近更新 更多