javascript中的事件代理初探_javascript技巧
May 16, 2016 pm 04:56 PM事件在javascript中一直是最強大的物件之一。 javascript提供了addEventListener和attachEvent兩個方法來為DOM節點綁定事件,jquery作了進一步封裝,提供了相容各個瀏覽器的bind方法。現在來看,這種傳統的事件綁定方式存在著以下不足:
1.可能需要綁定很多的EventHander。
假如頁面中某個表有100行,現在必須為每一行綁定一個click事件。那麼就必須綁定100個EventHandler,這對頁面效能來說有著極大的負擔,因為需要創建更多的記憶體來存放這些Handler。
2.事件無法綁定後加入的DOM節點。
假如頁面中的程式碼如下:
程式碼如下:
$$ "#dv").bind('click',function(){alert('test');});
$(body).append('
後加入的div是無法觸發點擊事件的。
為了解決這兩個問題,javascript引入了事件代理(event proxy)。首先,我們來了解js中的冒泡機制。
程式碼如下:
$.fn.mylive=function(eventType,fn){
var that=this.selector;
$(document).bind(eventType,function( event){
var match=$(event.target).closest(that) if(match.length !== 0){
fn.apply($(event.target),[event ]);
}
})
$("#tb td").mylive('click',function(event){
alert(event.target.innerHTML);
});
var tb='
the first column | the second column | the third column |
$("body").append(tb);
程式碼如下:
$("#tb td" ).mylive('click',function(event){ alert(event.target.innerHTML);
});
$(body).append('');
$.fn.mydelegate=function(selector,eventType,fn){
$(this).bind(eventType,function(event){
var match=$(event.target).closest( selector);
if(match.length !== 0){
fn.apply($(event.target),[event]);
}
});
);
});
}
$("#dv").mydelegate('td','click',function(event){
alert(event.target.innerHTML);
});
var tb='
the first column | the second column | the third column |
mydeletage方法不需要取得所有的td對象,而只需要取得綁定事件的div對象。這在執行效率上要優於live方法。
這裡僅僅起到一個拋磚引玉的作用,讓大家了解到事件代理的原理而已,jquery中的live和delegate實現要復雜的多。
熱門文章

熱門文章

熱門文章標籤

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)