1. 程式人生 > >javascript中事件流,事件相容,事件繫結

javascript中事件流,事件相容,事件繫結

1,事件流

事件流描述的是從頁面中接收事件的順序。 事件流是描述的從頁面接受事件的順序,當幾個都具有事件的元 素層疊在一起的時候,那麼你點選其中一個元素,並不是只有當前被 點選的元素會觸發事件,而層疊在你點選範圍的所有元素都會觸發事 件。事件流包括兩種模式:

冒泡和捕獲。

事件捕獲:父級元素先觸發,子集元素後觸發;

事件冒泡:子集元素先觸發,父級元素後觸發;

事件冒泡(從內至外)以及事件捕獲(從外至內)


<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			window.onload=function(){
				var div1=document.getElementById('div1');
				var div2=document.getElementById('div2');
				//建立一個數組,將獲取到的物件div1,div2,document,document.body
				var arr=[div1,div2,document,document.body];
				for(var i=0;i<arr.length;i++){
					//給每個陣列新增點選事件
					arr[i].onclick=function(){
						//alert(this);
						//console.log(this);
					}
                 //使用DOM經典方式
                 //事件冒泡
				arr[i].addEventListener('click',function(){
					console.log(this);
				},false);
				//事件捕獲
				arr[i].addEventListener('click',function(){
					console.log(this);
				},true);
			   }	
		    }
		</script>
	</head>
	<body >
		<div id="div1" style="width: 100px;height: 100px;border: 1px solid red;">
			<div id="div2" style="width: 50px;height: 50px;border: 1px solid black;">內部元素</div>
		</div>
	</body>
</html>

2, 事件相容

(1)事件繫結 addEventListener 用於註冊事件處理程式,IE 中為 attachEvent,我們為 什麼講 addEventListener 而不講 attachEvent 呢?一來 attachEvent 比較簡 單,二來 addEventListener 才是 DOM 中的標準內容。

語法 element.addEventListener(event, function, useCapture);

第一個引數是事件的型別 (如 "click" 或 "mousedown"). 第二個引數是事件觸發後呼叫的函式。 第三個引數是個布林值用於描述事件是冒泡還是捕獲。該引數是可選的。

注意:不要使用 "on" 字首。 例如,使用 "click" ,而不是使用 "onclick"。

你可以使用函式名,來引用外部函式:

3,事件移除:removeEventListener();

如果新增的事件處理函式將來想要移除就不能使用匿名函式的方式

案例:


<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			window.onload=function(){
				var btn1=document.getElementById('btn');
				btn1.addEventListener('click',show,false);
				function show(){
					alert('事件繫結');
				}
				//事件移除
				//btn1.removeEventListener('click',show,false);
			}
		</script>
	</head>
	<body>
		<input type="button" id="btn" value="事件註冊" />
	</body>
</html>

4,獲取事件物件

事件物件封裝了事件發生的詳細資訊,尤其是滑鼠、鍵盤事件。 如滑鼠事件發生的位置、鍵盤事件的鍵盤鍵等。

IE 中的事件物件: IE 中的事件物件是一個隱式可用的全域性物件:event,它是 window 物件的一個屬性。

標準 DOM 的事件物件: 在標準 DOM 瀏覽器檢測發生了某個事件時,將自動建立一個 Event 物件,並隱式地將該物件作為事件處理函式的第一個引數傳入

案例:



<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			//使用事件物件event 提供關於事件的相關詳細資訊
			window.onload=function(){
				var img1=document.getElementsByTagName('img1');
				img1.onclick=heandle;
			}
			function heandle(oEvent){
				if(window.event){
					oEvent=window.event;
				}
				//相容低版本的IE
				var oTarget;
				if(oEvent.srcElement){
					//獲取觸發事件的元素
					oTarget=oEvent.srcElement;
				}else{
					oTarget=oEvent.target;
				}
				//返回事件目標的名稱,使用屬性tagName
				alert(oTarget.tagName); 
			}
			
		</script>
	</head>
	<body>
		<img src="img/bgImage_01.png" id="img1" />
	</body>
</html>

5,阻止冒泡:event.stopPropagation()


<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<link rel="stylesheet" type="text/css" href="css/Demo1.css"/>
		<script type="text/javascript">
			/*window.onload = function() {
				document.getElementById("body").addEventListener("click",eventHandler);
			}
			//event:提供事件處理時的具體時間
			//event.timeStamp  表示獲取事件觸發時的具體時間
			function eventHandler(event) {
				console.log("時間:"+new Date(event.timeStamp)+" 產生事件的節點:" +event.target.id +" 當前節點:"+event.currentTarget.id);
			}*/
			
			window.onload=function(){
				//event.stopPropagation(): 阻止事件冒泡的產生
				document.getElementById('box1').addEventListener('click',function(event){
					alert('你點選了最外層div');
					event.stopPropagation(); //阻止事件冒泡
				});
				document.getElementById('box2').addEventListener('click',function(event){
					alert('你點選了第二層div');
					event.stopPropagation(); //阻止事件冒泡
				});
				document.getElementById('span').addEventListener('click',function(event){
					alert('你點選了最裡面span元素');
					event.stopPropagation(); //阻止事件冒泡
				});
				
			}
		</script>
	</head>
	<body id="body">
		<div id="box1" class="box1">
			<div id="box2" class="box2">
				<span id="span">This is a span.</span>
			</div>
		</div>
	</body>
</html>

6,阻止預設

w3c 的方法是 e.preventDefault(),IE 則是使用 e.returnValue = false; preventDefault

它是事件物件(Event)的一個方法,作用是取消 一個目標元素的預設行為。既然是說預設行為,當然是元素必須有默 認行為才能被取消,如果元素本身就沒有預設行為,呼叫當然就無效 了。什麼元素有預設行為呢?如連結,提交按鈕等。當event物件的cancel able為false時,表示沒有預設行為,這時即使有預設行為,呼叫preventDefault也是不會起作用的。

案例:


<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			//以下兩個方法都是用來阻止預設 事件的發生
//			w3c 的方法是 e.preventDefault(),
//			IE 則是使用 e.returnValue =false;
			//通過傳統的方式設定  阻止預設
			window.onload=function(){
				var a1=document.getElementsByTagName('a')[0];
//				a1.onclick=function(event){
//					//alert('頁面跳轉,觸發事件');
//					event.preventDefault(); //阻止事件的發生 /  阻止預設行為
//				}

				a1.addEventListener('click',function(e){
//					e.preventDefault();  //阻止預設
					if(e.preventDefault()){  //W3c標準
						e.preventDefault();
					}else{
						window.event.returnValue=false;  //IE提供阻止預設的方式
					}
				})
				
			}			
		</script>
	</head>
	<body>
		<a  href="http://www.yltedu.com" target="_blank">英萊特科技</a>
	</body>
</html>