1. 程式人生 > >JS事件的三個階段以及冒泡和事件物件event

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 

每次觸發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>