flash 事件流包括3個過程:尋找,目標和冒泡 3個過程,他是從最底層的displayobj開始搜尋,類似與樹狀結構搜尋,displaycontainer 中尋找這些元件.以前有時會遇到事件的觸發問題,例如事件被吃掉,事件被多個元件觸發.這裡需要注意下安排他們的層次例如要監聽的對象和無關的不想被觸發的對象保持兄弟接點的層次關係. 要想都觸發保持父子的節點關係.有時候我們不得不在一個父元件中添加子元件,同時父子元件都有事件需要監聽。然而,父元件的範圍比子元件大,點擊父元件,而沒有點到子元件 只響應父元件事件,點子元件(包含自父元件中)但卻不要求父元件響應父元件的事件,只響應子元件事件。那麼這個例子解決。 package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
/**
* @author memory
* 事件流的測試
*/
public class TestEvent extends Sprite
{
public function TestEvent():void{
var sp:Sprite = new Sprite();
sp.graphics.beginFill(0×00ff00,1);
sp.graphics.drawCircle(100,100,100);
var sp1:Sprite = new Sprite();
sp1.graphics.beginFill(0xccff00,1);
sp1.graphics.drawCircle(130,130,50);
sp.addChild(sp1)
this.addChild(sp);
sp.addEventListener(MouseEvent.CLICK,__tellTarget1);
sp1.addEventListener(MouseEvent.CLICK,__tellTarget2);
}
private function __tellTarget1(e:MouseEvent):void{
trace(”target1 = “+e.currentTarget);
trace(” @@”+e.target);
if(e.currentTarget==e.target){
trace(”equal”);
}else{
trace(”sorry”);
}
}
private function __tellTarget2(e:MouseEvent):void{
//(e.target as Sprite).parent.(MouseEvent.CLICK,__tellTarget1);
trace(”target2 = “+e.currentTarget+” @@”+e.target);
//(e.target as Sprite).parent.addEventListener(MouseEvent.CLICK,__tellTarget1);
}
}
}
//———————-總結——————————
使用先移出監聽在加監聽,在子元件事件中是不行的,因為事件流的冒泡階段還會遍曆他的父元件。
通過判斷 e.currentTarget==e.target 是否相同 即可知道事件觸發的元件是不是該元件。解決。
注意通常事件是在target 和冒泡階段調用元件的監聽事件,可以設定修改添加監聽的第3個參數true。但整個流程就會發生變化因為他不包含target 階段
使用sp.mouseChildren=false; 可以忽略子元件的事件流,當成子元件不存在 sp.buttonMode =true; 出現手型按鈕指示