Actionscript 3 为什么不是';t调度事件触发?
好的,这是我的主要项目中的问题,我正试图使用dispatchEvent触发一个事件,我制作了一个简单的测试类来测试这个,但它仍然不起作用 这是考试班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
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本机事件和自定义事件具有相同的事件生命周期。我已经用一些澄清更新了答案。