事件冒泡詳解

event代表事件的狀態,專門負責對事件的處理,它的屬性和方法能幫助我們完成很多和用戶交互的操作;


一、Event對象的主要屬性和方法
  
   1.type:事件的類型,就是HTML標籤屬性中,沒有“on”前綴之後的字符串,例如“Click”就代表單擊事件。


  2.srcElement:事件源,就是發生事件的元素。比如<a οnclick="check()"></a> a這個鏈接是事件發生的源頭,也就是該事件的srcElement。(非IE中用target)


  3.button:聲明瞭被按下的鼠標鍵,是一個整數。0代表沒有按鍵,1代表鼠標左鍵,2代表鼠標右鍵,4代表鼠標的中間鍵,如果按下了多個鼠標鍵,就把這些值加在一起,所以3就代表左右鍵同時按下。


  4.clientX/clientY:是指事件發生的時候,鼠標的橫、縱座標,返回的是整數,它們的值是相對於包容窗口的左上角生成的。


  5.offsetX/offsetY:鼠標指針相對於源元素的位置,可以確定單擊Image對象的哪個象素。


  6.altKey,ctrlKey,shiftKey:顧名思義,這些屬性是指鼠標事件發生的時候,是否同時按住了Alt、Ctrl或者Shift鍵,返回的是一個布爾值。


  7.keyCode:返回keydown和keyup事件發生的時候,按鍵的代碼以及keypress事件的Unicode字符。比如event.keyCode=13代表按下了回車鍵;


  8.fromElement、toElement前者是指代mouseover事件移動過的文檔元素,後者指代mouseout事件中鼠標移動到的文檔元素。


  9.cancelBubble:一個布爾屬性,把它設置爲true的時候,將停止事件進一步起泡到包容層次的元素,它用於檢測是否接受上層元素的事件的控制。true代表不被上層元素的事件控制,false代表允許被上層元素的事件控制。


  10.returnValue:一個布爾值屬性,設置爲false的時候可以阻止瀏覽器執行默認的事件動作,相當於<a href=”#” οnclick=”ProcessMethod();return false;” />。


          11.attachEvent()和detachEvent()方法:爲制定DOM對象事件類型註冊多個事件處理函數的方法,它們有兩個參數,第一個是事件類型,第二個是事件處理函數。在attachEvent()事件執行的時候,this關鍵字指向的是window對象,而不是發生事件的那個元素。


二、 IE Event對象的一些說明
  Event對象是一個全局屬性
  在IE中,不能把Event對象作爲參數傳遞給事件處理程序,只能用window.event或者event來引用Event對象。因爲在IE中,Event是window的一個屬性,也就是說event是一個全局變量,這個變量提供了事件的細節。




三、關於事件的起泡的概念


         IE中事件的起泡:IE中事件可以沿着包容層次一點點起泡到上層,也就是說,下層的DOM節點定義的事件處理函數,到了上層的節點如果還有和下層相同事件類型的事件處理函數,那麼上層的事件處理函數也會執行。例如,<div>標籤包含了<a>,如果這兩個標籤都有 onclick事件的處理函數,那麼執行的情況就是先執行<a>標籤的onclick事件處理函數,再執行<div>的事件處理函數。如果希望<a>的事件處理函數執行完畢之後,不希望執行上層的<div>的onclick的事件處理函數了,那麼就把 cancelBubble設置爲false即可。


四、W3C DOM標準中的Event
         和IE不同的是,W3C DOM中的Event對象並不是window全局對象下面的屬性,換句話說,event不是全局變量。通常在DOM二級標準中,event作爲發生事件的文檔對象的屬性。Event含有兩個子接口,分別是UIEvent和MutationEvent,這兩個子接口實現了Event的所有方法和屬性,而 MouseEvent接口又是UIEvent的子接口,所以實現了UIEvent和Event的所有方法和屬性。下面,我們就看看Event、 UIEvent和MouseEvent的主要屬性和方法。
  1.Event
     type:事件類型,和IE類似,但是沒有“on”前綴,例如單擊事件只是“click”。
     target:發生事件的節點。
     currentTarget:發生當前正在處理的事件的節點,可能是Target屬性所指向的節點,也可能由於捕捉或者起泡,指向Target所指節點的父節點。
     eventPhase:指定了事件傳播的階段。是一個數字。
     timeStamp:事件發生的時間。
     bubbles:指明該事件是否起泡。
     cancelable:指明該事件是否可以用preventDefault()方法來取消默認的動作。
     preventDefault()方法:取消事件的默認動作;
     stopPropagation()方法:停止事件傳播。
  2.UIEvent
     view:發生事件的window對象。
     detail:提供事件的額外信息,對於單擊事件、mousedown和mouseup事件都代表的是點擊次數。
  3.MouseEvent
   button:一個數字,指明在mousedown、mouseup和單擊事件中,鼠標鍵的狀態,和IE中的button屬性類似,但是數字代表的意義不一樣,0代表左鍵,1代表中間鍵,2代表右鍵。
   altKey、ctrlKey、shiftKey、metaKey:和IE相同,但是IE沒有最後一個。
clientX、clientY:和IE的含義相同,但是在DOM標準中,這兩個屬性值都不考慮文檔的滾動情況,也就是說,無論文檔滾動到哪裏,只要事件發生在窗口左上角,clientX和clientY都是0,所以在IE中,要想得到事件發生的座標相對於文檔開頭的位置,要加上 document.body.scrollLeft和document.body.scrollTop。
   screenX、screenY:鼠標指針相對於顯示器左上角的位置,如果你想打開新的窗口,這兩個屬性很重要。

   relatedTarget:和IE中的fromElement、toElement類似,除了對於mouseover和mouseout有意義外,其他的事件沒什麼意義。



一個簡單的實例:


<html> 
<head> 
<title> 阻止JavaScript事件冒泡傳遞(cancelBubble 、stopPropagation)</title> 
<meta name="keywords" content="JavaScript,事件冒泡,cancelBubble,stopPropagation" /> 
</head> 

<body> 
	<div id="parent1" οnclick="alert(this.id)" style="width:250px;background-color:yellow"> 
			<p>This is parent1 div.</p> 
			<div id="child1" οnclick="alert(this.id)" style="width:200px;background-color:orange"> <p>This is child1.</p> </div> 
			<p>This is parent1 div.</p> 
	</div> 

	<br /> 

	<div id="parent2" οnclick="alert(this.id)" style="width:250px;background-color:cyan;"> 
		<p>This is parent2 div.</p> 
		<div id="child2" οnclick="doSomething(this,event);" style="width:200px;background-color:lightblue;"> <p>This is child2. Will bubble.</p> </div> 
    	<p>This is parent2 div.</p> 
	</div> 
</body> 

</html>


				<script type="text/javascript"> 
					function doSomething (obj,evt) { 
							alert(obj.id); 
							var e=(evt)?evt:window.event; //判斷瀏覽器的類型,在基於ie內核的瀏覽器中的使用cancelBubble

							if (window.event) { 
							e.cancelBubble=true; 
							} else { 
							//e.preventDefault(); //在基於firefox內核的瀏覽器中支持做法stopPropagation
							e.stopPropagation(); 
							} 
					} 
				</script> 

JQ通用方法

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<link href="Css/Css.css" rel="stylesheet" type="text/css" />
<script src="Js/jquery-1.6.2.js" type="text/javascript"></script>
<script src="Js/TestJs.js" type="text/javascript"></script>
<title></title>
</head>
<body>
<table id="tab1">
    <tr id="tr1"><td id="td1">tdtdtdtdtdt</td></tr>
</table>
</body>
</html>

<script type="text/javascript">
    $(function () {
        $("#td1").click(function (e) { alert("td"); e.stopPropagation(); });
        $("#tr1").click(function () { alert("tr"); });
        $("#tab1").click(function () { alert("tab"); });
    });
</script>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章