在事件處理過程當中,會自動生成事件類的實例,並傳給偵聽器函數。經過這個參數就可使用事件類的屬性和方法。其中target與currentTarget屬性是兩個很類似的屬性。 對於簡單的事件處理過程,分清target與currentTarget並無必要。由於它們通常指向同一個對象。例如,舞臺中有一個實例名爲mc的影片剪輯實例,經過下面的代碼爲這個實例註冊單擊事件。 mc.addEventListener(MouseEvent.CLICK,this.test); function test(e:MouseEvent) { trace(e.target.name,e.currentTarget.name); } 輸出結果是同樣的,target與currentTarget屬性都是引用舞臺中的影片剪輯實例。但在一個相對複雜的顯示列表中,這兩個屬性是不相同的。 下面經過例子來了解target與currentTarget屬性的異同 1、新建Flash文檔 2、改圖層1名爲as,單擊圖層的第1幀,打開動做面板,輸入代碼: var sp1:Sprite=new Sprite() ; var sp2:Sprite=new Sprite() ; this.addChild(sp1) ; sp1.addChild(sp2) ; drawRect(sp1,0xff0000,200) ; drawRect(sp2,0x0000FF,100); //繪製矩形 function drawRect(obj:DisplayObject,c:uint,l:int):void; { obj.graphics.beginFill(c) ; obj.graphics.drawRect(0,0,l,l) ; } 上面的代碼在主時間軸中建立了Sprite類的實例sp1,在sp1實例內又建立了Sprite類的實例sp2。若是爲父級sp1註冊一個單擊事件偵聽器,當單擊sp1時,target與currentTarget都指向sp1,當單擊sp2時,target指向sp2,而currentTarget指向sp1。所以在不少應用中,通常認爲currentTarget指向父級。代碼以下: sp1.name="sp1"; sp2.name="sp2"; sp1.addEventListener(MouseEvent.CLICK,clickFunc); function clickFunc(e:MouseEvent):void { trace(e.target.name,e.currentTarget.name); } 3、測試影片,分別單擊大小矩形,查看信息 若是爲子級和父級都註冊一個偵聽器,那target屬性是指單擊的目標,而currentTarget屬性是指在處理的事件即活動目標,由於3.0的事件處理有捕獲、目標、冒泡3個階段,而且默認時採用冒泡機制,當單擊子級時,currentTarget屬性應先指向目標,並向上冒泡,就是先指向sp2,再指向sp1。 爲程序增長sp2註冊事件偵聽器: sp1.addEventListener(MouseEvent.CLICK,clickFunc); sp2.addEventListener(MouseEvent.CLICK,clickFunc); function clickFunc(e:MouseEvent):void { trace(e.target.name,e.currentTarget.name); } 所以,currentTarget屬性應具有兩個條件,一是它註冊了偵聽器,二是正在處理事件,而target屬性就指事件流中的目標,例如,單擊了sp2,無論事件如何冒泡或說無論currentTarget指向誰,target都指向sp2。 target屬性在事件流的目標階段,而currentTarget屬性在事件流的冒泡階段、目標階段和捕獲階段。以單擊事件爲例,只有事件流處於目標階段時,currentTarget屬性與target屬性的指向才相同,當事件流處於冒泡階段和捕獲階段時,target屬性老是指向被單擊的對象,而cu rrentTarget屬性指向當前事件活動的對象。 即便在沒有發生事件流的處理時,有時也需區別target和currentTarget屬性,好比在舞臺中建立mc1,在mc1中又建立mc2,且mc2位於mc1的上面。 當對父級對象即mc1處理事件時,使用下面的代碼1: mc1.addEventListener(MouseEvent.CLICK,fun) function fun(e:MouseEvent) { trace(e.target.name) } 測試影片時,單擊mc1,輸出mc1,單擊mc2,則輸出mc2。若是要使用e.target屬性始終指向mc1,可使用容器對象的mouseChildren屬性: mc1.mouseChildren = false; 當mc1的mouseChildren屬性被設置成 false後,mc1的子級對象將不能處理鼠標事件,此時無論單擊mc1仍是mc2輸出的都是mc1。代碼2: mc1.mouseChildren=false mc1.addEventListener(MouseEvent.CLICK,fun) function fun(e:MouseEvent) { trace(e.target.name) } 因爲currentTarget屬性指向當前事件活動的對象,而mc1註冊了單擊事件,mc2沒有註冊單擊事件,即mc1的事件是活動的。所以無論單擊mc1仍是mc2,currentTarget屬性確定指向mc1。 代碼3; mc1.addEventListener(MouseEvent.CLICK,fun) function fun(e:MouseEvent) { trace(e.currentTarget.name) }