Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 为什么不是';t调度事件触发?_Actionscript 3 - Fatal编程技术网

Actionscript 3 为什么不是';t调度事件触发?

Actionscript 3 为什么不是';t调度事件触发?,actionscript-3,Actionscript 3,好的,这是我的主要项目中的问题,我正试图使用dispatchEvent触发一个事件,我制作了一个简单的测试类来测试这个,但它仍然不起作用 这是考试班 package { import flash.display.Sprite; import flash.events.Event; public class Main extends Sprite { public function Main() { stage.addEventListener("pOver", ra

好的,这是我的主要项目中的问题,我正试图使用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");
    }

}

为什么它没有开火?或者为什么侦听器没有捕获该事件?

您正在
上调度该事件,它是
阶段的子级。如果您想在
阶段
上专门分派事件,请使用:

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

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

嗯,是和否

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

首先,您正在调度的事件不是冒泡
事件
。检查构造函数时,其签名如下所示:

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

其次,在事件生命周期的冒泡端附加了事件调度程序。如果你看签名,它看起来像这样:

public function Event(type:String, bubbles:Boolean = false, cancelable:Boolean = false)
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
我相信事件将始终贯穿捕获阶段,即使它们被标记为不冒泡。但我可能错了。我不记得“非冒泡”事件是否跳过了捕获和冒泡阶段,只是触发了目标事件阶段,我现在没有时间检查它


编辑

所以,我写了一篇:

这个函数的输出是

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

另一方面,冒泡的事件会掉头回到树上


希望这能把事情弄清楚。

首先,你在听舞台事件。这意味着,只要stage没有调度任何
事件
,您就不会得到任何回调

试一试


哦,那么我必须用同样的对象来发送事件吗?谢谢老兄!很快回复!你太棒了@Mattwillams您不必这样做,但如果不这样做,则需要了解事件冒泡的工作原理。@32bitkid我认为捕获阶段与用户交互事件(如键盘、鼠标事件等)相关。我不认为自定义事件经过捕获阶段。@catholicon本机事件和自定义事件具有相同的事件生命周期。我已经用一些澄清更新了答案。