js 解釋下什么是事件代理?應(yīng)用場(chǎng)景?
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
一、是什么事件代理,俗地來(lái)講,就是把一個(gè)元素響應(yīng)事件( 前面講到,事件流的都會(huì)經(jīng)過(guò)三個(gè)階段: 捕獲階段 -> 目標(biāo)階段 -> 冒泡階段,而事件委托就是在冒泡階段完成 事件委托,會(huì)把一個(gè)或者一組元素的事件委托到它的父層或者更外層元素上,真正綁定事件的是外層元素,而不是目標(biāo)元素 當(dāng)事件響應(yīng)到目標(biāo)元素上時(shí),會(huì)通過(guò)事件冒泡機(jī)制從而觸發(fā)它的外層元素的綁定事件上,然后在外層元素上去執(zhí)行函數(shù) 下面舉個(gè)例子: 比如一個(gè)宿舍的同學(xué)同時(shí)快遞到了,一種笨方法就是他們一個(gè)個(gè)去領(lǐng)取 較優(yōu)方法就是把這件事情委托給宿舍長(zhǎng),讓一個(gè)人出去拿好所有快遞,然后再根據(jù)收件人一一分發(fā)給每個(gè)同學(xué) 在這里,取快遞就是一個(gè)事件,每個(gè)同學(xué)指的是需要響應(yīng)事件的 所以真正綁定事件的是這個(gè)元素,按照收件人分發(fā)快遞的過(guò)程就是在事件執(zhí)行中,需要判斷當(dāng)前響應(yīng)的事件應(yīng)該匹配到被代理元素中的哪一個(gè)或者哪幾個(gè) 二、應(yīng)用場(chǎng)景如果我們有一個(gè)列表,列表之中有大量的列表項(xiàng),我們需要在點(diǎn)擊列表項(xiàng)的時(shí)候響應(yīng)一個(gè)事件 <ul id="list"> <li>item 1</li> <li>item 2</li> <li>item 3</li> ...... <li>item n</li> </ul> 如果給每個(gè)列表項(xiàng)一一都綁定一個(gè)函數(shù),那對(duì)于內(nèi)存消耗是非常大的 // 獲取目標(biāo)元素
const lis = document.getElementsByTagName("li")
// 循環(huán)遍歷綁定事件
for (let i = 0; i < lis.length; i++) {
lis[i].onclick = function(e){
console.log(e.target.innerHTML)
}
}這時(shí)候就可以事件委托,把點(diǎn)擊事件綁定在父級(jí)元素 // 給父層元素綁定事件
document.getElementById('list').addEventListener('click', function (e) {
// 兼容性處理
var event = e || window.event;
var target = event.target || event.srcElement;
// 判斷是否匹配目標(biāo)元素
if (target.nodeName.toLocaleLowerCase === 'li') {
console.log('the content is: ', target.innerHTML);
}
});還有一種場(chǎng)景是上述列表項(xiàng)并不多,我們給每個(gè)列表項(xiàng)都綁定了事件 但是如果用戶能夠隨時(shí)動(dòng)態(tài)的增加或者去除列表項(xiàng)元素,那么在每一次改變的時(shí)候都需要重新給新增的元素綁定事件,給即將刪去的元素解綁事件 如果用了事件委托就沒(méi)有這種麻煩了,因?yàn)槭录墙壎ㄔ诟笇拥模湍繕?biāo)元素的增減是沒(méi)有關(guān)系的,執(zhí)行到目標(biāo)元素是在真正響應(yīng)執(zhí)行事件函數(shù)的過(guò)程中去匹配的 舉個(gè)例子: 下面 <input type="button" name="" id="btn" value="添加" />
<ul id="ul1">
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
<li>item 4</li>
</ul>使用事件委托 const oBtn = document.getElementById("btn");
const oUl = document.getElementById("ul1");
const num = 4;
//事件委托,添加的子元素也有事件
oUl.onclick = function (ev) {
ev = ev || window.event;
const target = ev.target || ev.srcElement;
if (target.nodeName.toLowerCase() == 'li') {
console.log('the content is: ', target.innerHTML);
}
};
//添加新節(jié)點(diǎn)
oBtn.onclick = function () {
num++;
const oLi = document.createElement('li');
oLi.innerHTML = `item ${num}`;
oUl.appendChild(oLi);
};可以看到,使用事件委托,在動(dòng)態(tài)綁定事件的情況下是可以減少很多重復(fù)工作的 三、總結(jié)適合事件委托的事件有: 從上面應(yīng)用場(chǎng)景中,我們就可以看到使用事件委托存在兩大優(yōu)點(diǎn):
但是使用事件委托也是存在局限性:
如果把所有事件都用事件代理,可能會(huì)出現(xiàn)事件誤判,即本不該被觸發(fā)的事件被綁定上了事件 轉(zhuǎn)自https://www.cnblogs.com/smileZAZ/p/18199581 該文章在 2025/10/14 9:20:17 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |