2013-06-13 54 views
0

工作我有一個根組分A和二組分B,C C是B的前stopPropagation不撓曲

B和C具有的EventListener

B.addEventLisener(MouseEvent.MouseDown,handler1); 
C.addEventLisener(MouseEvent.MouseDown,handler2); 

我想當c趕上事件不泡到B

我使用

private function handler2(e:MouseEvent):void{ 
e.stopPropagation(); 
allowDraw = true;} 

在handler2,但它不工作!

回答

2

看起來,C和B是A的孩子。但是如果C不是B的孩子,它不會從C泡到B泡。冒泡只能從孩子到父母起作用​​。但是,如果B和C都是A的孩子,並且您在B之後添加了C,那麼並不意味着C變成了B的孩子。

這就是爲什麼事件處理程序會被添加執行的原因。你有2個解決方案:

1.swap添加處理程序

C.addEventLisener(MouseEvent.MouseDown,handler2); 
B.addEventLisener(MouseEvent.MouseDown,handler1); 

2.使用event priorities

B.addEventLisener(MouseEvent.MouseDown,handler1, false, 10); 
C.addEventLisener(MouseEvent.MouseDown,handler2, false, 20); 

此外,stopPropagation將無法​​正常工作。你需要刪除監聽器。

UPD

如果你不想刪除監聽器,使用布爾標誌;

private function handler2(e:MouseEvent):void { 
    e.stopPropagation(); 
    allowDraw = true; 
    stop = true; 
} 

private function handler1(e:MouseEvent):void { 
    if (stop) { 
     stop = false; 
     return; 
    } 
    //handler code 
} 
+0

由於我的程序的邏輯和你的第二個解決方案,你的第一個解決方案是不可能的:handler1仍然調用? – sami

+0

@sami是的,你需要做B.removeEventListener(MouseEvent.MOUSE_DOWN,handler1);在handler2 –

+0

哦,真糟糕!我不能這樣做!我需要B和C都有他們的事件聽衆所有的時間:( – sami