好吧所以这是我在我的主项目中的问题我正在尝试使用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");
}
}
Run Code Online (Sandbox Code Playgroud)
为什么不开火?或者为什么听众没有捕获该事件?
你正在派遣这个活动Main,这是一个孩子Stage.如果你想专门派遣一个事件,Stage那么使用:
stage.dispatchEvent(new Event("pOver"));
Run Code Online (Sandbox Code Playgroud)
现在你可能想知道,"如果它是一个孩子,那么我的事件处理程序应该仍然被触发!"
嗯,是的,不.
让我们看一下事件生命周期的简单图表:

首先,你派遣的事件不是冒泡Event.检查Event构造函数,其签名如下所示:
public function Event(type:String, bubbles:Boolean = false, cancelable:Boolean = false)
Run Code Online (Sandbox Code Playgroud)
请注意,默认情况下第二个参数false,这意味着此事件不执行事件生命周期的冒泡部分.
其次,您已将事件调度程序附加到事件生命周期的冒泡端.如果您查看签名,.addEventListener()它看起来像这样:
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
Run Code Online (Sandbox Code Playgroud)
注意第三个参数.默认情况下false再次出现.这意味着您将附加在活动的"冒泡"一侧.
这意味着此事件将转到目标元素,实例Main,然后停止,而不是去其他任何地方.
TL; DR:那么这意味着什么呢?
因此,要触发事件处理程序,而不是更改调度事件的位置,您需要更改要触发的事件:
this.dispatchEvent(new Event("pOver", true)); // this event will bubble
Run Code Online (Sandbox Code Playgroud)
然后你的事件处理程序,因为它是一个孩子,将由此事件触发.
相反,我认为非冒泡事件也会在事件生命周期的捕获方面发展,因此您也可以更改事件监听器以附加到事件的那一侧.
stage.addEventListener("pOver", rake, true); // attach to a capturing side
Run Code Online (Sandbox Code Playgroud)
我相信事件将始终流经捕获阶段,即使它们被标记为不冒泡.但我可能错了.我不记得"非冒泡"事件是否跳过捕获和冒泡阶段,只是触发目标事件阶段,我没有时间立即检查它.
编辑
所以,我写了一个关于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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个输出是
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
Run Code Online (Sandbox Code Playgroud)
请注意,事件将始终在捕获阶段进行.但是,如果它们没有被标记为"冒泡事件",请参见之前,当它们到达事件目标时(EventDispatcher事件已发送),它们将通过它们停止的树下降.
另一方面,冒泡事件将转过来并向后移动树.
希望,这可以解决问题.
| 归档时间: |
|
| 查看次数: |
2937 次 |
| 最近记录: |