2011-05-25 99 views
1

我很新的Flash和我有一些麻烦:闪光AS3事件分派

所以,我有我的课主要是进口类,NavMenu。在有一个点击项目相关的事件,运行在那里我写一个函数:

dispatchEvent(new Event('my_event')); 

在我的主类,在构造函数中我已经宣布

addEventListener('my_event', my_event_handler); 

,我有我想要的事件处理程序从舞台上删除一些孩子:

private function my_event_handler(event:Event):void 
{ 
    trace("my Event"); 
} 

没有任何反应,有人可以告诉我我做错了什么吗?

感谢

回答

3

需要分配监听调度它的对象。从你的代码,目前还不清楚是做什么的 - 但是,例如,在主:

//类主要

var _newClass:NewClass = new NewClass(); 
_newClass.addEventListener("my_event"), handler); 

,然后分派事件的NewClass

//class NewClass 
this.dispatchEvent(new Event("my_event")); 

现在,你似乎正在发射事件,但是你将侦听器添加到了错误的对象(在这种情况下,我认为Main类,它不是也在进行调度)。

注意 - 如果您在NewClass的构造函数中分派事件,您可能会错过该事件,因为在事件发生后您将分配侦听器。所以在别处开火。

  • 更新 -

正如@redconservatory指出,和@Prototypical,气泡可以在这种情况下被利用。但是,有一些限制。

通常情况下,如果在eventListener方法sig中使用use_capture参数== false(缺省值),那么确实需要直接针对某个对象接收事件。为了使冒泡阶段:

this.addEventListener("my_event", handler, true); //use_capture == true 

分派事件现在将成为活动的符合条件的目标,因为它“泡沫”备份层次结构中的儿童的家长。在这种情况下,@ redconservatory的答案是正确的。这里的重要例外是冒泡只适用于DisplayObjects。 NewClass必须将DisplayObject或一个祖先扩展到显示列表中,冒泡才能正常工作。

从LiveDocs中

捕获和冒泡发生,因为从节点事件对象移动到显示列表节点:捕捉和儿童对父母的起泡家长对孩子。这个过程与继承层次无关。除了定位阶段之外,只有DisplayObject对象(容器和控件等可视对象)可以具有捕获阶段和冒泡阶段。

有关事件传播这个非常重要的主题的完整讨论 - 请查看introduction to event handling

+1

这个答案和关于其他答案冒泡的信息应该可以合并为一个最终答案。两者都可以工作(假设他的导航菜单真正连接到主类),但排除任一解决方案似乎都不正确。我会建议解释一些冒泡。 – prototypical 2011-05-25 18:36:34

2

尝试使事件冒泡到主类

dispatchEvent(new Event('my_event', true)); // "true" sets bubbling to true 

而在的addEventListener使听者上主要的阶段:

stage.addEventListener('my_event', my_event_handler);