1 事件階段
- 事件捕獲階段: 從Window->Document->html--->到具體的target
- 事件冒泡階段: 從target-->Window
1.1 事件階段只能二選一
- addEventListener(type,fn,boolean)
- boolean: 默認false,冒泡
- true: 捕獲階段.
1.2 可以同時擁有捕獲和冒泡嗎?
1.3同時擁有冒泡和捕獲時,哪個先執(zhí)行?
- 先捕獲::老子--再兒子,再冒泡::兒子--再老子.
1.4特例
- 沒有父子關(guān)系,僅僅有一個元素
- 冒泡和捕獲誰先監(jiān)聽,誰先執(zhí)行.
2 捕獲與冒泡的特性
2.1 捕獲不可取消,但是冒泡可以.
2.2中斷冒泡
- e.stopPropagation()
- 中斷冒泡后,事件不會繼續(xù)傳播.
- 一般用于封裝某些獨立的組件.
2.3 取消(阻止)默認動作
2.4 有些事件不能阻止默認動作.
- scroll事件,不可以阻止默認動作
- 因為先有滾動,才會有滾動事件.
2.5 如何阻止?jié)L動呢?
- 阻止wheel,或者touchstart的默認動作.
- CSS取消滾動條.
2.5 Bubbles 與 Cancelable
- Bubbles的意思是該事件是否冒泡,所有冒泡都可以取消.
- Cancelable的意思是開發(fā)者是否可以阻止默認事件.
- Cancelable與冒泡無關(guān).
3 事件委托
3.1什么是事件委托?
- 使用祖先元素監(jiān)聽子孫元素觸發(fā)事件.
3.2 為什么使用事件監(jiān)聽?
- 節(jié)省內(nèi)存
- 可以監(jiān)聽動態(tài)元素.(目前不存在的元素)
4 封裝事件委托
<div id="testDiv">
<li>123</li>
</div>
<script>
let on = function (eventType, parentE, sonE, fn) {
if (!(parentE instanceof Element)) {
el = document.querySelector(parentE);
}
el.addEventListener(eventType, e => {
const target = e.target;
if (t.matches(sonE)) {
fn(e);
}
});
};
on('click', '#testDiv', 'li', e => console.log(e));
</script>
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。