什么是事件委托?
事件委托就是利用冒泡的原理,将事件加到 父元素 或 祖先元素上,触发执行效果!
说起事件委托我们先来了解一下事件的三个阶段:
1. 事件捕获阶段(从外到内)
产生事件的时候会从document发出一个事件流,这个事件流随着我们的DOM树流向触发事件的目标;
2. 事件目标阶段
如果这个目标上有事件,则会被触发;如果没有,在当前目标上没有事件触发;
3. 时间冒泡阶段(从内到外)
如果祖先元素绑定有事件,那么这个事件会被依次触发,从内到外的顺序;
例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>事件委托练习</title>
<script src="../../../jquery.min.js"></script>
<style>
.one {
width: 500px;
height: 500px;
background-color: aquamarine;
margin: 100px 500px;
}
.two {
width: 300px;
height: 300px;
background-color: rgb(222, 245, 17);
}
</style>
</head>
<body>
<div class="one">
<div class="two"></div>
</div>
<script>
$('.one').on('click',function(){
alert('您点击的是第一个盒子')
})
$('.two').on('click',function(){
alert('您点击的是第二个盒子')
})
</script>
</body>
</html>
如题:给两个盒子绑定点击事件,但是我想要的结果是点击第二个盒子的话弹出框,这时你会发现,第二个盒子点击之后紧接着第一个盒子也会弹出框,这就是事件冒泡;
看下什么是事件冒泡?
事件冒泡,就是元素自身的事件被触发后,如果父元素有相同的事件,如onclick事件,那么元素本身的触发状态就会传递,也就是冒到父元素,父元素的相同事件也会一级一级根据嵌套关系向外触发,直到document/window,冒泡过程结束!
那如何阻止时间冒泡?
使用 e(event).stopPropagation() 起到阻止捕获和冒泡阶段中当前事件的进一步传播。
事件对象e : 事件触发的时候会自动生成一个事件对象,生命周期是从事件开始到事件结束,有位置信息(事件本身是谁)、触发的事件类型、触发的事件元素等......
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>事件委托练习</title>
<script src="../../../jquery.min.js"></script>
<style>
.one {
width: 500px;
height: 500px;
background-color: aquamarine;
margin: 100px 500px;
}
.two {
width: 300px;
height: 300px;
background-color: rgb(222, 245, 17);
}
</style>
</head>
<body>
<div class="one">
<div class="two"></div>
</div>
<script>
$('.one').on('click',function(){
alert('您点击的是第一个盒子')
})
$('.two').on('click',function(e){
e.stopPropagation(); // 阻止事件冒泡,如果不阻止的话就会你点第二个的话结束之后第一个也会弹出
alert('您点击的是第二个盒子')
})
</script>
</body>
</html>
这样就不会出现点第二个盒子第一个盒子也会弹出框!
拓展问题:如果第二个盒子是通过js增加的元素,没有事件;该如何解决?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>事件委托练习</title>
<script src="../../../jquery.min.js"></script>
<style>
.one {
width: 500px;
height: 500px;
background-color: aquamarine;
margin: 100px 500px;
}
.two {
width: 300px;
height: 300px;
background-color: rgb(222, 245, 17);
}
</style>
</head>
<body>
<div class="one">
<!-- <div class="two"></div> -->
</div>
<script>
//如果是你之后添加的元素 怎么办?
$(`<div class="two"></div>`).appendTo('.one');
$('.one').on('click','.two',function(e){
e.stopPropagation(); // 阻止事件冒泡,如果不阻止的话就会你点第二个的话结束之后第一个也会弹出
alert('您点击的是第二个盒子')
})
</script>
</body>
</html>
使用事件委托,将当前元素的事件委托给祖先元素(需要注意的是 当前的事件必须是祖先元素的子元素)。