在事件處理過程中,會自動生成事件類的實例,並傳給偵聽器函數。通過這個參數就可以使用事件類的屬性和方法。其中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) }