捕獲和冒泡

捕獲:從外向內(nèi)
冒泡:從內(nèi)向外

在一個(gè)事件發(fā)生時(shí),捕獲過(guò)程跟冒泡過(guò)程總是先后發(fā)生,跟你是否監(jiān)聽(tīng)毫無(wú)關(guān)聯(lián),先捕獲后冒泡。

addEventListener有三個(gè)參數(shù):

  • 事件名稱(chēng)
  • 事件處理函數(shù)
  • 是否捕獲(true為捕獲,false為冒泡,默認(rèn)為false)
document.body.addEventListener('click', eventHandler, true)

當(dāng)我們實(shí)際監(jiān)聽(tīng)事件時(shí),默認(rèn)使用冒泡模式,當(dāng)開(kāi)發(fā)組件時(shí),需要通過(guò)父元素控制子元素的行為,可以使用捕獲機(jī)制。

阻止冒泡和取消默認(rèn)事件
  1. 阻止冒泡
    方法:event.stopPropagation()
<button id="btn">點(diǎn)擊</button>

javascript:
document.body.addEventListener('click', (event) => {
  event.stopPropagation();
  console.log('捕獲階段:body');
}, true);
document.getElementById('btn').addEventListener('click', (event) => {
  console.log('捕獲階段:button');
}, true);
document.body.addEventListener('click', (event) => {
  console.log('冒泡階段:body');
}, false);
document.getElementById('btn').addEventListener('click', (event) => {
  console.log('冒泡階段:button');
}, false);

如果沒(méi)有加event.stopPropagation()的話(huà),執(zhí)行順序應(yīng)該是:
捕獲階段:body
捕獲階段:button
冒泡階段:button
冒泡階段:body

但是在捕獲階段的body層事件處理方法內(nèi)增加了event.stopPropagation()的話(huà),執(zhí)行順序就變成了:
捕獲階段:body

由此可得,在上面正常執(zhí)行順序的任意一層,增加event.stopPropagation(),那么原本跟在它后面執(zhí)行的事件都會(huì)被阻止

因?yàn)槭录?zhí)行到了捕獲階段body層后,被阻止了,該事件不會(huì)再向內(nèi)或向外執(zhí)行。

  1. 取消默認(rèn)事件
    方法:event.preventDefault()
    作用:取消一個(gè)目標(biāo)元素的默認(rèn)行為,例如:a標(biāo)簽的鏈接跳轉(zhuǎn)行為
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容