欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS事件三个阶段

程序员文章站 2024-01-20 21:05:34
...

事件的处理过程主要有三个阶段:捕获阶段,目标阶段,冒泡阶段;
1.捕获阶段
当我们为某个元素绑定事件时,事件触发前会经历事件捕获阶段
如图
JS事件三个阶段
我们给某个div注册点击事件的时候,会经历事件捕获阶段,事件从最外层捕获一直找到当前绑定事件的元素这里称为事件目标阶段,然后触发click事件()。
2.目标阶段
当事件从最外层不断传递到目标节点的时候,最后在目标节点触发事件。
3.事件冒泡
当事件触发的时候,会一层一层的往外冒至最外层元素,这里恰好与事件捕获相反
JS事件三个阶段
我们来看一个例子

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#one {
			width:300px;
			height:200px;
			background: red
		}
		#two {
			width:250px;
			height:150px;
			background: blue
		}
		#three{
			width:200px;
			height:100px;
			background: orange
		}
	</style>
</head>
<body>
	<div id='one'>one
		<div id='two'>two
			<div id='three'>three</div>
		</div>
	</div>

</body>
<script type="text/javascript">
	var three = document.getElementById('three');
	one.onclick=function(){
		console.log('one')
		
	}
	two.onclick=function(){
		console.log('two')
		
	}
	three.onclick=function(){
		console.log('three')
		
	}
	
	
</script>
</html>

我们给3个div分别注册了点击事件,当我们点击最里面的div时。
JS事件三个阶段
输出了三次,这是因为事件冒泡的原因,当最里面的div被点击时事件会一层一层的往外冒
由于三个div绑定了同一种事件所以每个元素都执行了一次。

需要注意的是我们普通注册的事件都是在事件冒泡阶段执行的
onclick ,mouseover.等等
mouseentermouseleave不会触发事件冒泡

有时候我们不希望事件在冒泡阶段执行,怎么办?
1.通过事件对象提供的stopPropagation()方法

three.onclick=function(e){
		console.log('three');
		e.stopPropagation();//停止
	}

2.通过addEventListener注册的事件可以修改第三个参数决定事件是在捕获或冒泡阶段执行
true事件捕获
false事件冒泡

清除元素默认行为 e.preventDefault()

相关标签: JQ