2011-07-31 52 views
3

jQuery中,如果我這樣做...attachEvent或addEventListener - 存儲在哪裏?

$('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')中。有什麼我可以迭代它的地方?我假設他們在某個地方排隊等候,但我找不到文檔來指引我正確的方向。

+0

您無法訪問該信息 – Raynos

+0

對不起,您不相信您開箱即用,但如果您有一些文件來備份該聲明,我會很感激。 – AlienWebguy

回答

4

quirksmode

當前實現W3C的事件註冊的

一個問題 模型是你不能找出是否有任何事件處理程序都已經 註冊到的元素。在傳統模式中,你可以這樣做:

alert(element.onclick) 

,你查看通過註冊它,或者如果 沒有註冊未定義功能。僅在其最近的DOM Level 3 Events W3C 中添加了一個eventListenerList來存儲當前在元素上註冊的事件處理程序列表 。此功能尚未支持任何瀏覽器,因此太新了。但是,問題已得到解決,已被 解決。

+0

這是古老的。 DOM級別3的事件是從2002年開始的。2002年「不受任何瀏覽器支持」是...... IE7在2006年問世,看看我們到底有多遠。 – AlienWebguy

+1

@AlienWebGuy即使瀏覽器也不支持它。 – Raynos

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.addEventListenerel所有事件偵聽器。

您需要使用墊片來處理瀏覽器支持。目前Chrome 12和Firefox 5不支持此功能

+0

跛腳。認真使用JQuery的另一個理由。 – AlienWebguy

+0

@AlienWebGuy不是使用jQuery的理由。這是使用跨瀏覽器polyfill的原因。 jQuery是一個特殊的polyfill(並且在那裏是一個相當平庸的) – Raynos

+0

與大衆意見相矛盾的粗體陳述。你推薦什麼polyfill? – AlienWebguy