好吧所以这是我在我的主项目中遇到的问题我正在尝试使用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");
}
}
为什么不解雇?或者为什么听众没有捕捉到那个事件?
答案 0 :(得分:7)
您正在Main
上发送活动,Stage
是Stage
的孩子。如果您想在stage.dispatchEvent(new Event("pOver"));
上专门发送一个事件,请使用:
Event
现在你可能想知道,“如果它是一个孩子,那么我的事件处理程序应该仍然被触发!”
嗯,是的,没有。
让我们看一下事件生命周期的简单图表:
首先,您要调度的事件不是冒泡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"));