js事件(Event)之(二)事件流模型


前續:本文來自於網絡文章整理,僅供參考,歡迎糾錯指正。

1、DOM同時支持兩種事件模型:捕獲型事件和冒泡型事件 (有些瀏覽器不支持捕獲 )

eventPhase:調用事件處理的階段,1捕獲,2目標,3冒泡
捕獲階段是由上層元素到下層元素的順序依次。而冒泡階段則正相反。如下圖:

當事件觸發時body會先得到有事件發生的信息,然后依次往下傳遞,直到到達最詳細的元素。這就是事件捕獲階段。 
還記得事件注冊方法ele.addEventListener(type,handler,flag)吧,Flag是一個Boolean值,true表示事件捕捉階段執行,false表示事件冒泡階段執行。 
接着就是事件冒泡階段。從下往上 依次執行事件處理函數(當然前提是當前元素為該事件注冊了事件句柄)。
在這個過程中,可以阻止事件的冒泡,即停止向上的傳遞。 
阻止冒泡有時是很有必要的,實例如下:

1 <div>
2     <input type="button" value="測試事件冒泡" />
3 </div>

2、冒泡部分:

 1 var $input = document.getElementsByTagName("input")[0];
 2 var $div = document.getElementsByTagName("div")[0];
 3 var $body = document.getElementsByTagName("body")[0];
 4         
 5 $input.onclick = function(e){
 6     this.style.border = "5px solid red"
 7     var e = e || window.e;
 8     alert("red");
 9 }
10 $div.onclick = function(e){
11     this.style.border = "5px solid green";
12     alert("green");
13 }
14 $body.onclick = function(e){
15     this.style.border = "5px solid yellow";
16     alert("yellow");
17 }
18 
19 //依次彈出”red“,"green","yellow"

你的本意是觸發button這個元素,卻連同父元素綁定的事件一同觸發。這就是事件冒泡。

如果對input的事件綁定改為:
 1 $input.onclick = function(e){
 2     this.style.border = "5px solid red"
 3     var e = e || window.e;
 4     if (e && e.stopPropagation){
 5         e.stopPropagation();//阻止事件冒泡
 6     }else{
 7         e.cancelBubble=true;//IE
 8     }      
 9 }
10 
11 //這個時候只會彈出”red“,因為阻止了事件冒泡。

3、捕獲部分:

 1 $input.addEventListener("click", function(){
 2     this.style.border = "5px solid red";
 3     alert("red");
 4 }, true)
 5 $div.addEventListener("click", function(){
 6     this.style.border = "5px solid green";
 7     alert("green");
 8 }, true)
 9 $body.addEventListener("click", function(){
10     this.style.border = "5px solid yellow";
11     alert("yellow");
12 }, true)
13  
14 //這個時候依次彈出”yellow“,"green","red"。
15  
16 //這就是事件的捕獲。
17 //如果把addEventListener方法的第三個參數改成false,則表示只在冒泡的階段觸發,彈出的依次為:”red“,"green","yellow"。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM