为什么没有调度事件发射?

时间:2012-02-06 13:42:36

标签: actionscript-3

好吧所以这是我在我的主项目中遇到的问题我正在尝试使用dispatchEvent来激活一个事件我已经做了一个简单的测试类来测试它但它仍然没有工作......

这是测试类

package 
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite 
{
    public function Main() {

        stage.addEventListener("pOver", rake);


        dispatchEvent(new Event("pOver"));
    }


    public function rake(e:Event):void {

        trace("working");
    }

}

为什么不解雇?或者为什么听众没有捕捉到那个事件?

2 个答案:

答案 0 :(得分:7)

您正在Main上发送活动,StageStage的孩子。如果您想在stage.dispatchEvent(new Event("pOver")); 上专门发送一个事件,请使用:

Event

现在你可能想知道,“如果它是一个孩子,那么我的事件处理程序应该仍然被触发!”

嗯,是的,没有。

让我们看一下事件生命周期的简单图表:

enter image description here

首先,您要调度的事件不是冒泡public function Event(type:String, bubbles:Boolean = false, cancelable:Boolean = false) 。检查Event构造函数,其签名如下所示:

false

请注意,第二个参数默认为public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void ,这意味着此事件不会执行事件生命周期的冒泡部分。

其次,您已将事件调度程序附加到事件生命周期的冒泡方面。如果您查看.addEventListener()的签名,它看起来像这样:

false

注意第三个参数。默认情况下,这是Main。这意味着您将附加在活动的“冒泡”一侧。

这意味着此事件将转到目标元素this.dispatchEvent(new Event("pOver", true)); // this event will bubble 的实例,然后停止而不会转到其他任何位置。

TL; DR 那么这意味着什么?

因此,要触发事件处理程序而不是更改事件的调度位置,您需要更改要触发的事件:

stage.addEventListener("pOver", rake, true); // attach to a capturing side

然后你的事件处理程序,因为它是一个孩子,将由此事件触发。

相反,我认为非冒泡事件也会在事件生命周期的捕获方面进展,因此您也可以更改事件监听器以附加到事件的那一侧。

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");
        }
    }
}

相信该事件将始终流经捕获阶段,即使它们被标记为不冒泡。但我可能错了。我不记得“非冒泡”事件是否跳过捕获和冒泡阶段,只是触发目标事件阶段,我现在没有时间检查它。


修改

所以,我写了quick test on wonderfl

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

请注意,事件将始终在捕获阶段进行。但是,如果它们没有被标记为“冒泡事件”,请参见之前,当它们到达事件的目标时,它们将通过它们停止的树下降(事件的{{1}}已发送)。

另一方面,冒泡事件将转向向上树。

希望这可以解决问题。

答案 1 :(得分:1)

首先,您正在听舞台活动。这意味着只要舞台不调度任何Events你就不会得到任何回调。

stage.dispatchEvent(new Event("pOver"));