AS3:自定义事件传播

问题描述

| 我正在尝试组装一系列由外部加载的swfs组成的投影仪,我的一般问题将尽可能简短。 如果加载到
ctrl
中的外部swf(在创作过程中放在舞台上的MovieClip实例)在其第一帧和最后一帧中具有:
 dispatchEvent(new Event(\"FirsT_FRAME\")); // in the first frame,and: 
 dispatchEvent(new Event(\"LAST_FRAME\")); // in the last frame 
那么-这些事件是否应该在ctrl容器中被“听到”? 目前,我似乎只能监听加载的内容中的那些事件,而不是“更高”,我的意思是-如果我在加载程序完整监听器中说:
mc:MovieClip = MovieClip(e.currentTarget.content);
mc.addEventListener(\"LAST_FRAME\",function(){ // something });
然后听到事件,但是当我说:
ctrl.addEventListener(\"LAST_FRAME\",function(){ // something });
后者似乎更强大,因此我正在努力使其发挥作用,但是我想我已经错过了一些教训;-) 有人经历过这个吗?我的方法是正确的还是应该走另一条路? 欢呼大家。     

解决方法

        通过在分派事件时将bubbles选项设置为true,可以使“ 4”显示对象接收从外部swf分派的事件。请看以下示例,其中将SWFB.swf加载到SWFA.swf中: SWFB:
package swfb
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE,init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE,init);

            const SECOND:int = 1000;

            var timer:Timer = new Timer(5 * SECOND,1);
            timer.addEventListener(TimerEvent.TIMER_COMPLETE,onTimerComplete);
            timer.start();

        }// end function

        private function onTimerComplete(e:TimerEvent):void
        {
            dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE,true,true));

        }// end function

    }// end class

}// end package
SWFA:
package swfa
{
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.net.URLRequest;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE,init);

            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaderComplete);
            loader.load(new URLRequest(\"swf/SWFB.swf\"));


        }// end function

        private function onLoaderComplete(e:Event):void
        {
            var loaderInfo:LoaderInfo = LoaderInfo(e.target);

            var container:Sprite = new Sprite();
            container.addChild(loaderInfo.content);
            container.addEventListener(TimerEvent.TIMER_COMPLETE,onContainerTimerComplete);
            addChild(container);

        }// end function

        private function onContainerTimerComplete(e:TimerEvent):void
        {
            trace(\"TIMER COMPLETE!\");

            e.stopPropagation();

        }// end function

    }// end class

}// end package
将SWFB.swf添加到舞台5秒后,将调度a7ѭ事件。调度事件时,气泡和可取消选项设置为true。 在SWFA.swf中,将SWFB.swf加载到其中,然后添加到名为“ 8”的显示对象容器中。然后,将一个事件侦听器添加到容器,该侦听器从SWFB.swf侦听要调度的ѭ7事件。分派事件时,事件处理程序将调用Timer事件的11方法来停止事件的传播(如其名称所示)。