1.DOM 事件分三个阶段
- 捕获阶段:事件从window对象自上而下向目标节点传播的阶段(由外向内找监听函数);
- 目标阶段:真正的目标节点正在处理事件的阶段;
- 冒泡阶段:事件从目标节点自下而上向window对象传播的阶段(由内向外找监听函数)。
添加和删除事件写法:
el.addEventListener('click',fn,bool) // W3C,bool为true捕获,为false冒泡(或什么都不写)el.removeEventListener('click',fn,bool)
事件流图示(包含DOM事件的三个阶段):
2.捕获与冒泡同时包含时如何执行
先捕获(由外到内)后冒泡(由内到外)
代码如下:
<body><div id="el">目标元素<style>#el{width: 200px;height: 100px;background: red;}</style></div><script>const el = document.getElementById('el')el.addEventListener('click',(e)=>{console.log('捕获内')}, true)document.body.addEventListener('click',(e)=>{console.log('捕获外')}, true)document.body.addEventListener('click',(e)=>{console.log('冒泡外')})el.addEventListener('click',(e)=>{console.log('冒泡内')})</script></body>
执行JS,点击目标元素,控制台显示如下:
注意:没有父子关系的情况下,没有冒泡或捕获一说,谁先监听,谁先执行
3.取消冒泡
捕获不能中断,但有些事件的冒泡可以取消(可搜索 事件名+event+MDN 查看冒泡是否可取消)
取消冒泡代码如下:
e.stopPropagation() // 执行完当前事件停止冒泡
