我是Flash的新手,我遇到了一些麻烦:
所以我的班级Main导入了一个类NavMenu。在有一个单击项目的事件中运行我写的函数:
dispatchEvent(new Event('my_event'));
在我的Main类中,在我声明的构造函数中
addEventListener('my_event', my_event_handler);
我有EventHandler,我想从舞台上删除一些孩子:
private function my_event_handler(event:Event):void
{
trace("my Event");
}
没有任何反应,有人可以告诉我我做错了吗?
由于
答案 0 :(得分:3)
您需要将侦听器分配给调度它的对象。从你的代码中,不清楚是做什么的 - 但是,例如,在你的主要:
// class Main
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 :(得分:2)
尝试将事件冒泡到Main类
dispatchEvent(new Event('my_event', true)); // "true" sets bubbling to true
在addEventListener中,在Main的舞台上创建监听器:
stage.addEventListener('my_event', my_event_handler);