一個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