事件冒泡和事件捕获
事件监听函数
addEventListener(‘ev’,fn,[Boolean,{}])
它有三个参数
第一个参数:执行事件的名称
第二个参数:fn函数
第三个参数:传递有两种形式:Boolean或者一个对象
默认第三个参数是 false (不捕获,因此该函数默认是冒泡执行的),第三个参数:如果是布尔值:true 是进行捕获执行, false 不捕获
事件冒泡
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div{
height: 200px;
width: 200px;
background: red;
}
p{
width: 100px;
height: 100px;
background: blueviolet;
}
</style>
</head>
<body>
<div>
<p></p>
</div>
<script>
{
let div = document.querySelector("div");
let p = document.querySelector("p");
div.addEventListener("click",()=>{
alert("div");
});
p.addEventListener("click",()=>{
alert("p");
});
}
</script>
</body>
</html>
事件冒泡的执行顺序 : 由小到大 p > div > body > html
事件捕获
{
let div = document.querySelector("div");
let p = document.querySelector("p");
div.addEventListener("click",()=>{
alert("div");
},true);
p.addEventListener("click",()=>{
alert("p");
},true);
}
事件捕获: 由大到小 html > body > div > p
实际捕获和冒泡是反着进行的
事件捕获:当事件发生时,最先得到通知的是window,然后是document,由上至下逐级依次而入,直到真正触发事件的那个元素(目标元素)为止,这个过程就是捕获。
事件冒泡:事件会从目标元素开始起泡,由下至上逐级依次传播,直到window对象为止,这个过程就是冒泡。
同时事件监听函数的 第三个参数 还可以 传递对象:{}
capture:true/false 是否在捕获阶段执行
once:true/false 只执行一次事件
{
let div = document.querySelector("div");
let p = document.querySelector("p");
// document.addEventListener('click',function(){
// alert('document');
// });
// document.body.addEventListener('click',function(){
// alert('body')
// });
div.addEventListener("click",()=>{
alert("div");
});
p.addEventListener("click",()=>{
alert("p");
},{
capture:true
});
}
是冒泡的执行形式:
let div = document.querySelector("div");
let p = document.querySelector("p");
// div.addEventListener("click",()=>{
// alert("div");
// });
div.addEventListener('click',function(){
alert('div');
},{
capture:true
});
p.addEventListener("click",()=>{
alert("p");
},{
capture:true
});
是捕获的执行形式:
let div = document.querySelector("div");
let p = document.querySelector("p");
div.addEventListener('click',function(){
alert('div');
},{
once:true
});
p.addEventListener("click",()=>{
alert("p");
});
div的点击事件只执行一次。
(后续待补充)