
30
|
第二章
委派事件(Delegating Events)
由於事件會以氣泡傳遞方式往更上層的元件傳播,因此可以試著採取另一種做法:只針
對上層元件設定事件監聽器,再檢查事件來自哪個子元件。像 SproutCore(
http://www.
sproutcore.com
)框架平台,就是藉由採用這樣的做法,降低應用程式裡的事件監聽器
數量:
// 為 ul 清單設定委派事件機制
list.addEventListener("click", function(e){
if (e.currentTarget.tagName == "li") {
/* ... */
return false;
}
}, false);
針對這種做法,jQuery 提供了一種絕佳的實作方式;只要呼叫
delegate()
函式,然後
再傳入三組引數即可:子選取項、事件類型、事件處理器。當然也可以直接幫每一組
li
元件分別設定相對應的
click
事件。不過採用
delegate()
函式的做法,可以降低事件監
聽器的數量,進而改善程式的效能:
// 請不要這麼做!這樣等於是幫每一組「li」元件設定監聽器(需耗費昂費的資源成本)
$("ul li").click(function(){ /* ... */ });
// 這麼做只需要設定一組事件監聽器
$("ul").delegate("li", "click", /* ... */);
採用委派事件機制的另一個好處,是可以讓所有動態被加進網頁元件的子元件,都還能共
用同一組事件監聽器。就拿前面那段程式碼範例來說 ...