首頁  >  文章  >  web前端  >  詳解javascript事件冒泡_javascript技巧

詳解javascript事件冒泡_javascript技巧

WBOY
WBOY原創
2016-05-16 15:20:451341瀏覽

事件是javascript的核心內容之一,在對事件的應用中不可避免的要涉及到一個重要的概念,那就是事件冒泡,在介紹事件冒泡之前,先介紹一下另一個重要的概念事件流:
一.什麼是事件流:
文檔物件模型(DOM)是一個樹狀結構,可以形象的用下圖表示。

如果一個html元素觸發事件,那麼這個事件就會在DOM樹中的觸發節點和根節點之間按照一定的順序傳播,所有經過的節點都會接收到被觸發的事件,這個傳播過程被稱之為事件流。依照事件的傳播順序,可以將其分為兩類,一種是事件冒泡,一種是事件捕獲,這裡就涉及到本章要介紹的主題了:
1.事件冒泡:
所謂的時間冒泡就是當一個元素觸發一個事件,事件會像是水泡一樣,從觸發元素向它的所有父節點傳播,一直到根節點都會接收到此事件,如果父元素中註冊了相應的事件處理函數,那麼儘管事件在子節點觸發的,在父元素上註冊的事件處理函數同樣會被觸發。例如在上面圖示中,如果觸發a元素的onclick事件,那麼它的父元素p、document和widow都會接收到此事件,並且如果在相應的父元素註冊有時間處理函數,那麼此事件處理函數將會執行,看一段程式碼實例:

<html>
<head>
<meta charset="utf-8"/>
<title>事件冒泡简单介绍</title>
<script type="text/javascript">
window.onload=function(){
 var table=document.getElementById("mytable");
 table.onclick=function(e){
 var event=e||window.event;
 target=event.srcElement||event.target;
 alert(target.innerHTML);
 }
}
</script>
</head>
<body>
<table width="400" border="1" id="mytable">
<tr>
 <td>脚本之家</td>
 <td>脚本之家</td>
 <td>脚本之家</td>
</tr>
<tr>
 <td>脚本之家</td>
 <td>脚本之家</td>
 <td>脚本之家</td>
</tr>
<tr>
 <td>脚本之家</td>
 <td>脚本之家</td>
 <td>脚本之家</td>
</tr>
</table>
</body>
</html>

以上程式碼的目的是,點擊對應的儲存格的時候就會彈出對應儲存格中的內容。但在上面的實作中並不是為每個單元格註冊onclick事件處理函數,而是將onclick事件處理函數註冊於單元格的父元素table上,當點擊單元格的時候會觸發onclick事件,事件還會從從事件物件向上傳播,而table元素剛好有註冊的onclick事件處理函數,這個時候就會執行此處理函數,當然這裡會設定到傳遞事件物件參數的問題。所有的瀏覽器都支援事件冒泡。二.事件擷取:
事件捕獲和事件冒泡恰好相反,當點擊一個元素的時候,事件傳播的方向是從根元素到觸發元素,IE瀏覽器並不支持,為了跨瀏覽器支持,所以默認情況下一般都是使用冒泡型事件處理模型。
2.javascript阻止事件冒泡程式碼
事件冒泡在某些場景非常的有用,但是有時候也是必須要阻止,以下是一段能夠兼容所有主流瀏覽器的阻止事件冒泡的實例代碼。
程式碼實例:

function stopBubble(e) 
{ 
 if(e&&e.stopPropagation) 
 { 
 e.stopPropagation(); 
 } 
 else
 { 
 window.event.cancelBubble=true; 
 } 
}

以上程式碼可以阻止事件冒泡,下面對程式碼做簡單註解:
二、程式碼註解:

  • 1.function stopBubble(e) {},此函數用來阻止事件冒泡,參數為事件物件。
  • 2. if(e&&e.stopPropagation){e.stopPropagation();},判斷是否支援stopPropagation,若支援就使用e.stopPropagation()。 stopPropagation()函數IE10和IE10以下瀏覽器不支援。
  • 3.window.event.cancelBubble=true,目前IE瀏覽器使用這個可以阻止事件冒泡。

以上就是關於javascript事件冒泡的詳細介紹,希望對大家的學習有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn