JS事件的三个阶段以及冒泡和事件对象event

js事件的三个阶段分别为:捕获、目标、冒泡  
  
1.捕获:事件由页面元素接收,逐级向下,到具体的元素  
2.目标:具体的元素本身  
3.冒泡:跟捕获相反,具体元素本身,逐级向上,到页面元素  


事件捕获:当使用事件捕获时,父级元素先触发,子元素后触发  
事件冒泡:当使用事件冒泡时,子级元素先触发,父元素后触发

IE5.5:div---body---document  
  
IE6.0:   div---body---html---document  
  
主流浏览器:div---body---html---document---window  
    
W3C :   任何事件发生时,先从顶层开始进行事件捕获,直到事件触发到达事件源,再从事件源向上进行事件捕获  
标准浏览器:addEventListener("click","doSomething","true")方法,若第三参数为true则采用事件捕获,若为false,则采用事件冒泡  
IE浏览器只支持事件冒泡,不支持事件捕获,所以它不支持addEventListener("click","doSomething","true")方法,所以ie浏览器使用ele.attachEvent("onclick",doSomething)  
  
事件传播的阻止方法:  
  
再W3C中,使用stopPropagation()方法(无论是捕获阶段还是冒泡阶段都可以阻止)  
  
在IE下使用cancelBubble = true方法  
  
阻止默认行为:  
  
再W3c中,使用preventDefault()方法  
  

再IE下return false 

 

this和e.target的异同

每次触发DOM事件时会产生一个事件对象(也称event对象),此处的参数e接收事件对象,e为事件对象。而事件对象也有很多属性和方法,其中target属性是获取触发事件对象的目标,也就是绑定事件的元素,e.target表示该DOM元素,然后在获取其相应的属性值。

this和event.target的区别:

js中事件是会冒泡的,所以this是可以变化的,但event.target不会变化,它永远是直接接受事件的目标DOM元素;

.this和event.target都是dom对象

 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<script type="text/javascript" src="js/jquery-3.2.1.min.js">
			
		</script>
		<style type="text/css">
			*{
				padding:0;margin:0;
			}
		</style>
	</head>
	<body>
		<div id="parent" style="width:200px;height: 200px;background: blue;">
		    <div id="son1" style="width:100px;height: 100px;background:red;"></div>
		    <div id="son2" style="width:100px;height:100px;background: yellow;"></div>
		</div>
		<script type="text/javascript">
			var parent=document.getElementById("parent")
			var son1=document.getElementById("son1")
			var son2=document.getElementById("son2")
			parent.addEventListener("click",function(e){
				alert(1)
				
			},true)
			
			son1.addEventListener("click",function(e){
				alert(2)
			},true)
			
			son2.addEventListener("click",function(e){
				alert(3)
			},true)
			
		</script>
		
	</body>
</html>

当参数为true时,为捕获阶段。点击子元素,会从最外面开始触发,一直到作用事件的元素为止。

当参数为false时,为冒泡阶段,点击子元素,从作用事件元素开始,一直触发到最外面,一般是到window。

如果想阻止捕获或者冒泡,只需要写e.stopPropagation()即可。

注意,无论阻止冒泡还是阻止捕获,都是用e.stopPropagation()

阻止冒泡栗子:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<a href="javascript:;" onclick="setCategory(event)" id="testA"></a>
		
		<script type="text/javascript">
			function setCategory(e){
		        //如果提供了事件对象,则这是一个非IE浏览器 
				if ( e && e.stopPropagation ) 
				    //因此它支持W3C的stopPropagation()方法 
				    e.stopPropagation(); 
				else 
				    //否则,我们需要使用IE的方式来取消事件冒泡 
				    window.event.cancelBubble = true; 
		    }
			//或者
			var a = document.getElementById("testA");
			a.onclick =function(e){
				//如果提供了事件对象,则这是一个非IE浏览器 
				if ( e && e.stopPropagation ) 
				    //因此它支持W3C的stopPropagation()方法 
				    e.stopPropagation(); 
				else 
				    //否则,我们需要使用IE的方式来取消事件冒泡 
				    window.event.cancelBubble = true; 
			}
		</script>
	</body>
</html>

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆趣编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值