Вы отправляете событие на Main
, который является потомком Stage
.Если вы хотите специально отправить событие на Stage
, используйте:
stage.dispatchEvent(new Event("pOver"));
Теперь вы можете задаться вопросом: «Если это ребенок, то мой обработчик событий все равно должен запускаться!"
Ну, да, и нет.
Давайте взглянем на простую диаграмму жизненного цикла события:
Сначаласобытие, которое вы отправляете, не является пузырем Event
.Изучив конструктор Event
, его подпись выглядит следующим образом:
public function Event(type:String, bubbles:Boolean = false, cancelable:Boolean = false)
Обратите внимание, что второй аргумент по умолчанию false
, что означает, что это событие не выполняет всплывающую частьжизненного цикла события.
Во-вторых, вы прикрепили диспетчер событий к всплывающей стороне жизненного цикла события.Если вы посмотрите на подпись для .addEventListener()
, она выглядит так:
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
Обратите внимание на третий аргумент.Что по умолчанию false
снова.Это означает, что вы присоединяетесь к «пузырящейся» стороне события.
Это означает, что это событие попадает к целевому элементу, экземпляру Main
, а затем останавливается и никуда не уходит.
TL; DR : Так, что это все значит?
Так, чтобы вызвать ваш обработчик событий, , а не изменить гдесобытие отправляется , вам нужно изменить событие, которое вы запускаете, на:
this.dispatchEvent(new Event("pOver", true)); // this event will bubble
Тогда ваш обработчик событий, так как он является дочерним, будет запускаться этим событием.
И наоборот, я думаю, что не пузырьковые события также будут проходить через сторону захвата жизненного цикла события, поэтому вы также можете изменить свой прослушиватель событий, чтобы присоединить его и к той стороне события.
stage.addEventListener("pOver", rake, true); // attach to a capturing side
I полагаю , что событие всегда будет проходить через фазу захвата, даже если они помечены как не пузырьковые.Но я могу ошибаться в этом.Я просто не могу вспомнить, пропускают ли «не пузырьковые» события и фазы захвата, и пузырьковые события, и просто запускаю целевую фазу события, и у меня нет времени проверять это прямо сейчас.
Edit
Итак, я написал быстрый тест на wonderfl :
package {
import flash.events.Event;
import flash.display.Sprite;
public class FlashTest extends Sprite {
private var debug:TextField;
public function FlashTest() {
stage.addEventListener("Foo", bubbleFooHandler);
stage.addEventListener("Foo", captureFooHandler, true);
trace("Ready");
trace("---------------");
trace("Trying a non-bubbling event");
this.dispatchEvent(new Event("Foo"));
trace("---------------");
trace("Trying a bubbling event");
this.dispatchEvent(new Event("Foo", true));
}
private function captureFooHandler(e:Event):void {
trace("Triggered \"Foo\" from capturing phase\n");
}
private function bubbleFooHandler(e:Event):void {
trace("Triggered \"Foo\" from bubbling phase");
}
}
}
Выход из этого
Ready
---------------
Trying a non-bubbling event
Triggered "Foo" from capturing phase
---------------
Trying a bubbling event
Triggered "Foo" from capturing phase
Triggered "Foo" from bubbling phase
Обратите внимание, что события всегда будут проходить через фазу захвата.Однако, если они не помечены как «пузырящиеся события», смотрите выше, они будут спускаться через дерево, которое они останавливают, когда достигают цели события (EventDispatcher
, на которое было отправлено событие).
Пузырьковые события, с другой стороны, развернутся и вернутся вверх дерева.
Надеюсь, это прояснит ситуацию.