新人補鈣系列教程之:AS3事件處理--事件流

一個flash應用程序可能會很是複雜,好比,有不少可視實例嵌套在一塊兒,這樣的話會造成一個樹形結構,這個結構的根是stage,而後一級級到不一樣的實例,通常來講,要把這個樹形結構倒過來看,即stage在頂部,在stage中的實例一級級排列在下面,要參考幫助中的圖。 

這樣的一個樹狀結構即display list,每一個實例(stage也是實例)都是樹中的一個節點(node),如何來處理這種複雜結構的事件呢?as3引入了事件流的概念 

事件流用於描述事件發生在display list中,遍歷其全部node的過程,它能夠分爲3個階段: 

一、捕獲階段(capture phase):從頂部(如stage)到目標 

二、目標階段(target phase):目標 

三、冒泡階段(bubbling phase):從目標到頂部 

看一個例子: 

一、創建一個display list,其包含了4個可視實例,root1,mc1,mc2,mc3 

import flash.display.* 

var mc1=new Sprite() 

var mc2=new Sprite() 

var mc3=new Sprite() 

//this表明root1 

this.addChild(mc1) 

mc1.addChild(mc2) 

mc2.addChild(mc3) 

drawRect(mc1,0xff9900,200) 

drawRect(mc2,0x0000FF,100) 

drawRect(mc3,0xffbbff,50) 

//繪製矩形 

function drawRect(obj,c,l){ 

  obj.graphics.beginFill(c) 

  obj.graphics.drawRect(0,0,l,l) 

} 

二、爲display list中的全部實例註冊click事件偵聽器 

this.addEventListener("click",clickFunc) 

mc1.addEventListener("click",clickFunc) 

mc2.addEventListener("click",clickFunc) 

mc3.addEventListener("click",clickFunc) 

function clickFunc(evt:Event){   

  trace(evt.currentTarget.name+" is click") 

  } 

} 

三、測試一下,單擊最小的矩形,看看事件的執行順序 

instance3 is click 

instance2 is click 

instance1 is click 

root1 is click 

從順序中能夠看出,事件流採用了冒泡機制,即從單擊的目標(instance3)開始,向頂部流動,最後到達root1。 

經過 

trace(evt.eventPhase) 

能夠知道事件流的階段,結果以下: 

instance3 is click 

2 

instance2 is click 

3 

instance1 is click 

3 

root1 is click 

3 

2表明目標階段,相應的實例即你所單擊的實例,3表明冒泡階段。 

若是要使事件流使用捕獲機制,在註冊偵聽時應多加一個參數,把useCapture參數設置爲true 

this.addEventListener("click",clickFunc,true) 

若是兩種機制都要使用,須註冊兩次偵聽器,useCapture的的值分別爲true,false 

事件對象是Event類的實例,具備多個屬性,其中target與currentTarget屬性必須把它們分精楚。 

對於一個簡單的事件處理過程,分清target與currentTarget並無必要,由於它們通常指向同一個對象,如對一個簡單的mc容器註冊偵聽器,在處理事件過程當中,這兩個屬性都指向了這個mc。 

但在一個相對複雜的display list中,這兩屬性是不相同的,好比,在主場景中有一個實例名爲mc的影片剪輯實例,此mc包含了一個子mc,假設實例名爲mc1 

若是爲父級即mc註冊一個click事件偵聽器,當單擊mc時,target與currentTarget都指向mc,當單擊mc1時,target指向mc1,而currentTarget指向mc,所以,在不少應用中,可能有人會認爲currentTarget會指向父級。 

若是爲子級和父級都註冊一個偵聽器,那target是指單擊的目標,而currentTarget是指在處理事件(即活動)的目標,由於as3的事件處理有3個階段(捕獲、目標、冒泡),而且缺省時採用冒泡機制,當單擊子級mc1時,currentTarget應先指向底層,並向上冒泡,即先指向mc1,再指向mc 

因此,currentTarget屬性應具有兩條件,一是它註冊了偵聽器,二是正在處理事件,而target就指事件流中的target。例如,單擊了mc1,無論事件如何冒泡(無論currentTarget指向誰),target都指向mc1, 

小結:target屬性在事件流的目標階段,而currentTarget屬性在事件流的冒泡階段(如currentTarget有時指父級)和目標階段(兩屬性的指向相同),固然也能夠是捕獲階段。  (轉載)node

相關文章
相關標籤/搜索