事件綁定與監聽
事件是JavaScript應用程序的核心,是所有內容的驅動。
事件的實現在主流瀏覽器之間存在較大差異,但是瞭解事件的機制仍然非常重要,以W3C中的事件模型作爲研究對象。
1. 事件監聽的綁定函數:
函數簽名:addEventListener(eventType, callback, useCapture)
參數說明:eventType:事件類型,例如:click、blur等
callback:事件被觸發時執行這個函數
useCapture:事件傳播機制:如果爲true時,事件處理程序以捕捉(capturing)模式觸發,反之,事件處理
以冒泡模式觸發,可以使用event對象中的stopPropagation()函數終止冒泡。
通過調用event對象的preventDefault()函數來阻止默認行爲,同樣也可以通過在回調中返回false來實現同樣的效果。
2.事件監聽的解綁函數:
函數簽名:removeEventListener(eventType, callbackListenerl)
參數說明:eventType:移除事件的類型,例如:click、blur等;如果監聽的函數是匿名函數,沒有任何引用指向它,在
不銷燬目標元素的前提下,這個監聽是無法被移除的。
事件庫
處理衆多瀏覽器的差異性需要藉助第三方JavaScript類庫來支持,例如:jQuery、MooTools、YUI等。
jQuery的API提供了bind()函數來跨瀏覽器綁定事件監聽,傳人事件名稱和回調函數,例如:
jQuery('#elementId').bind(eventName, handler);還提供了快捷方式:jQuery('#elementId').click(callback);
需要保證DOM元素存在並被已被加載。
切換上下文
new function(){
this.appName = 'ucfpay';
document.body.addEventListener('click', function(event){
// 上下文發生改變,因此appName是undefined
alert(this.appName);
}, false);
};
要想保持原有的上下文,需要將回調函數包裝進一個匿名函數,然後定義一個引用指向它。
使用代理函數來保持當前的上下文。jQuery中提供了proxy()函數,只需將指定的上下文傳人函數即可:
$('signinForm').submit($.proxy(function(){/* ... */}), this);
委託事件
從事件冒泡時開始就發生了事件委託,我們可以直接給父元素綁定事件監聽,用來檢測在其子元素內
發生的事件,用來建設應用
中的事件監聽的數量:
// 在ul列表上座了事件委託
list.addEventListener('click', function(e){
if (e.currentTarget.tagName == 'li'){
/* ... */
return alse;
}
}, false);
jQuery提供了delegate()函數,可以減少事件監聽的數量,改善代碼性能:
$('ul li').click(function(){/* ... */});
$('ul').delegate('li','click',function(){/* ... */}); // 事件委託,所有爲元素添加的子元素都具有事件監聽。
自定義事件
jQuery中可以使用trigger()函數來觸發自定義事件。可以通過命名空間形式來管理事件名稱。
// 綁定自定義事件
$('.className').bind('refresh.widget', function(){});
// 觸發自定義事件 $('.className').trigger('refresh.widget'); 通過給trigger()傳人一個額外的參數來給事件處理程序傳人數據。數據會員附加參數的形式帶人回調: $('.class').bind('frob.widget', function(event, dataNumber){ console.log(dataNumber); }); $('.class').trigger('frob.widget', 5); 和內置事件一樣,自定義事件同樣會沿着DOM樹做冒泡。
自定義事件和jQuery插件
DOM無關事件