概念
事件委托又叫事件代理扔茅,事件委托就是利用事件冒泡傅联,只制定一個事件處理程序,就可以管理某一類型的所有事件浩蓉。
在js中事件冒泡得知派继,子元素身上的事件會冒泡到父元素身上宾袜。事件代理就是將未來子元素身上的時間加在了父元素身上,當(dāng)子元素時間觸發(fā)時驾窟,會一級一級向上執(zhí)行庆猫,這樣我們就可以讓父元素上代為執(zhí)行。通過Event對象可判斷是哪個子元素觸發(fā)了事件绅络。
為什么使用委托
dom對象都需要有事件處理函數(shù)月培,我們可以直接對每一個dom設(shè)置處理函數(shù),但是如果我們有很多dom需要添加事件處理呢恩急?如果我們有100個a標(biāo)簽杉畜,每個a標(biāo)簽都有相同的click事件。大家都能想到的方法是通過for循環(huán)衷恭,遍歷每個a標(biāo)簽添加事件以達(dá)到目的此叠。但是這樣做又有什么缺點呢?
在JavaScript中随珠,添加到頁面上的處理事件程序的數(shù)量講直接關(guān)系到頁面整體的運行性能拌蜘,因為需要不斷的訪問dom節(jié)點進(jìn)行交互,dom操作是一個很耗費性能的操作牙丽,這樣事件過多就將會引起瀏覽器延長整個界面交互的時間。所以減少dom操作也是性能優(yōu)化的一個重要環(huán)節(jié)兔魂。
每一個函數(shù)都是一個對象烤芦,每個對象都會占用一定的內(nèi)存空間,對象越多占用的空間也就越大析校,性能就會越來越差构罗。
又如果,因頁面美化原因智玻,我們這100個a標(biāo)簽是懶加載的形式遂唧,我們不知道當(dāng)前頁面有多少個a標(biāo)簽,也不知道一共有多少個a標(biāo)簽吊奢,這樣通過for循環(huán)的方式是不是又無法達(dá)到目的了呢盖彭。
此時,如果我們是用時間委托页滚,那么我們就可以只對他們的父級元素這一個對象進(jìn)行操作召边,無論是dom操作和事件操作,相對于for循環(huán)的方式都節(jié)省了很多資源裹驰,新增對象也無需再添加事件隧熙,自然性能就更優(yōu)。
代碼示例
<div id='parent'>
<a href='#' id='baidu'><a>
<a href='#' id='jianshu'><a>
</div>
var dom = document.getElementById('parent');
dom.addEventListener('click', function(e) {
if(e.target.nodeName.toLowerCase == 'a') {
if(e.target.id == 'baidu') {
location.;
} else if (e.target.id == 'jianshu') {
location.href = "http://www.reibang.com";
}
})
}