我构建了一个传递变量的自定义事件调度程序。我发送事件然后我尝试在我的文档根目录中监听事件,但我从未收到过该事件。如何将事件冒泡到我的文档类?
addEventListener(CustomVarEvent.pinClicked, pinClickedHandler);
function pinClickedHandler(e:CustomVarEvent) {
trace("main says " + e.arg[0] + " clicked");//access arguments array
}
package zoomify.viewer
{
import com.maps.CustomVarEvent;
protected function hotspotClickHandler(event:MouseEvent):void {
var hotspotData:Hotspot = hotspotsMap[event.currentTarget] as Hotspot;
trace(hotspotData._name + " was clicked");
/*if(hotspotData) {
navigateToURL(new URLRequest(hotspotData.url), hotspotData.urlTarget);
}*/
dispatchEvent(new CustomVarEvent("pinClicked",true,false,hotspotData._name));
}
}
package com.maps
{
// Import class
import flash.events.Event;
// CustomVarEvent
public class CustomVarEvent extends Event {
public static const pinClicked:String = "pinClicked";
// Properties
public var arg:*;
// Constructor
public function CustomVarEvent(type:String, ... a:*) {
var bubbles:Boolean = true;
var cancelable:Boolean = false;
super(type, bubbles, cancelable);
arg = a;
}
// Override clone
override public function clone():Event{
return new CustomVarEvent(type, arg);
};
}
}
正在调度的pinClicked事件嵌套在类的两个深层。我在舞台上添加了一个类ZoomifyViewer的实例。 ZoomifyViewer将ZoomGrid的实例添加到舞台,ZoomGrid将调度该事件。
当我将相同的事件监听器和处理函数直接添加到我的ZoomGrid类(调度事件的同一个类)时,监听器和处理程序正常工作。但是,当侦听器和处理程序在父类或舞台上时,我没有得到任何响应。
是否需要调度员冒泡起泡沫?
另外,基于我的CustomVarEvent中定义的常量pinClicked,这两行在功能上是否相同?
dispatchEvent(new CustomVarEvent(CustomVarEvent.pinClicked, hotspotData._name));
dispatchEvent(new CustomVarEvent("pinClicked", hotspotData._name));
答案 0 :(得分:4)
如果调度事件的对象是DisplayObject (或DisplayObject的祖先,例如Sprite或MovieClip),则事件只能在显示列表中冒泡,以便它可以在显示列表并在事件发送时将其添加到显示列表。
你编写的代码没有将一个事件作为一个类的一部分调度的行,只是一个包中的一个函数,所以我不知道你打算在哪里冒泡。
快速修复你只需让被点击的同一个对象从它上面调出事件,因为它被点击它显然是一个在舞台上的显示对象,它符合我们对冒泡的两个规定。
package zoomify.viewer
{
import com.maps.CustomVarEvent;
protected function hotspotClickHandler(event:MouseEvent):void
{
// BY THE WAY, event.currentTarget will return the actual object, so you
// don't need whatever the hotspotsMap[] thing is, just cast event.currentTarget
/*var hotspotData:Hotspot = hotspotsMap[event.currentTarget] as Hotspot;*/
var hotspotData:Hotspot = event.currentTarget as Hotspot;
// here we dispatch the event off of the target, since it is definitely
// in the display list already, so therefore bubbling will work right
event.target.dispatchEvent(new CustomVarEvent("pinClicked",true,false,hotspotData._name));
}
}
答案 1 :(得分:3)
事件在显示列表中冒泡。我无法从您的代码示例中看出您要从哪个对象调度事件,只是您在类上有一个方法来执行此操作。该类的实例是否已添加到显示列表中?
答案 2 :(得分:0)
只有当调度事件的对象位于displaylist上时,冒泡才有效。哪个是舞台的孙子。
这是您的问题,但如果您将调度类添加到displaylist,我无法从代码段中看到。
此外,它看起来不像是自定义EventDispatcher,而是自定义事件。但我可能错了(看不到你的所有代码)。
答案 3 :(得分:-1)
为了收听您的自定义事件,您应该对文档类中的调度程序有一个有效的引用。
yourDispatcher.addEventListener(CustomVarEvent.pinClicked,pinClickedHandler);
yourDispatcher 是调度自定义事件的类。