CODE-列舉元素已掛載的jQuery事件

開發程式時偵錯的需求,想確認預期的事件函數是否已正確bind到元素上?

直覺想法是去查詢jQuery內部物件,列出已經掛載的事件函數。追了一下原始程式,發現jQuery會把各元素的事件保存在jQuery.data(elem, "events"),而events裡又會為不同事件(例如: click, dblclick, load)各宣告一個handlers,放入events[eventType];由於我們可以對同一事件宣告多個事件函數,因此handlers中會以handlers[handlerId]的方式保存事件函數。

看起來很抽象,跑一次範例便一目瞭然:

$("div")
.click(function() { alert("Click 1"); })
.click(function() { alert("Click 2"); })
.dblclick(function() { alert("DblClick"); });
var handlers = jQuery.data($("div")[0], "events");
var sb = [];
for (var t in handlers)
{
    sb.push("*EventType=" + t);
    for (var h in handlers[t])
        sb.push("    HandlerId[" + h + "]->" + handlers[t][h]);
}
alert(sb.join("\n"));

可得結果如下: (程式裡所謂HandlerId是一個流水號,是jQuery.event物件為每個事件函數所賦與不重複的編號)

*EventType=click
    HandlerId[3]->function() { alert("Click 1"); }
    HandlerId[4]->function() { alert("Click 2"); }
*EventType=dblclick
    HandlerId[5]->function() { alert("DblClick"); }

實地測試,這個做法在jQuery-1.3.2或jQuery-1.4下都是可行的。但在jQuery 1.4下HandlerId會從1起跳,背後原因是jQuery-1.4取消了原本在bindReady()裡jQuery.event.add( window, "load", jQuery.ready );,以及防止IE Memory Leak的邏輯中改用attachEvent取代jQuery( window ).bind( 'unload', ...);,少了兩個系統內建事件函數,自訂事件函數序號變成從1開始。

【註】以上的做法列舉範圍只限透過jQuery.bind方式宣告的事件函數。

歡迎推文分享:
Published 23 January 2010 10:37 AM 由 Jeffrey
Filed under: ,
Views: 12,432



意見

# kk said on 27 April, 2010 08:26 PM

Jeffrey大...您好

如果想要取的掛載某事件的元素的話,請問該怎麼做呢?

請J大指點了!謝謝

# Ark said on 28 April, 2010 04:35 PM

一般jquery framwork的設計導向會以class為事件綁定的標籤

可參照jquery ui

dom 元素bind event 後會多ui-xxxx的class 名稱,SO 逆向的取就是用 .hasClass('ui-xxxx') 來判別有沒被綁到

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<January 2010>
SunMonTueWedThuFriSat
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication