2013-06-13 3 views
0

я есть корневой компонент А и компонент В два, С, что С передней части BstopPropagation не работает в гибком

В и С имеют EventListener

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

я хочу, когда с поймать событие это не пузырь B

я использую

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

в Handler2, но он не работает!

ответ

2

Кажется, что C и B являются дочерними элементами A. Но если C не является дочерним по B, он не будет пузыряться от C до B. Bubbling работает только от ребенка к родительскому. Но если B и C являются детьми из A и вы добавили C после B, это не значит, что C стал дочерним по отношению к B.

Вот почему обработчики событий выполняются, чтобы они были добавлены. У вас есть 2 решения:

1.swap добавления обработчиков

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

2.Use 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); in handler2 –

+0

О, так плохо! я не могу этого сделать! Мне нужно, чтобы B и C оба имели свое событие Listeners все время :( – sami