首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >as3事件处理

as3事件处理
EN

Stack Overflow用户
提问于 2010-12-06 17:20:44
回答 2查看 351关注 0票数 1

我在AS3中遇到了奇怪的事件处理问题。

我有两个类:

代码语言:javascript
复制
public class Configurator extends Sprite {

    public function Configurator () {
        this.addEventListener(FramedPhoto.FRAMED_PHOTO_LOADED, this._test);
        var fp = new FramedPhoto();
    }

    protected function _test(event:Event) {
        trace('_test()');
    }
}

第二个是:

代码语言:javascript
复制
public class FramedPhoto extends Sprite {

    public static const FRAMED_PHOTO_LOADED = 'framedPhotoLoaded';

    public function FramedPhoto () {
        trace('FramedPhoto()');
        this.dispatchEvent(new Event(FramedPhoto.FRAMED_PHOTO_LOADED, true, false));
    }
}

问题是_test()没有被触发。你知道这里有什么地方会做错吗?

包含源文件的测试包可从http://blackbox.home.pl/test.zip获得

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-06 17:28:23

事件是以分层方式分派的,所以在任何地方侦听事件都不会起到作用。您需要做的是让您的配置器侦听调度事件的对象或显示列表中它上面的对象。如果您希望捕获所有事件,则需要侦听所有事件中最顶层的对象,即stage

票数 1
EN

Stack Overflow用户

发布于 2010-12-06 19:38:58

grapefrukt一针见血,但更确切地说,它被称为事件流。简单地说,当从显示列表中的显示对象调用dispatchEvent()时,有3个阶段,即捕获阶段、目标阶段和气泡阶段。在捕获阶段,flash播放器将显示列表从舞台向下移动到调用dispatchEvent().Then的显示对象。在目标阶段,目标显示对象将调度事件。然后在气泡阶段,事件气泡上升到舞台。

在您的示例中,如果希望配置器显示对象听到从FramedPhoto显示对象调度的事件,则必须将FramedPhoto添加到其显示列表中。

我擅自向您的项目添加了一个document类,因为您无论如何都应该避免使用时间线。

代码语言:javascript
复制
package
{
    import com.Configurator;
    import flash.display.MovieClip;

    public class Main extends MovieClip
    {
        public function Main():void
        {
            init();

        }// end function

        private function init():void
        {
            var configurator:Configurator = new Configurator();
            addChild(configurator);

        }// end function

    }// end class

}// end package

我导入了Configurator类(将包从abc重命名为com),声明、实例化并将其添加到显示列表中。

代码语言:javascript
复制
package com
{
    import com.FramedPhoto;
    import flash.display.Sprite;
    import flash.events.Event;

    public class Configurator extends Sprite 
    {
        public function Configurator():void 
        {
            var framedPhoto:FramedPhoto = new FramedPhoto();
            addChild(framedPhoto);

            framedPhoto.addEventListener(FramedPhoto.FRAMED_PHOTO_LOADED, framedPhotoLoadedHandler);

        }// end function

        public function framedPhotoLoadedHandler(e:Event):void
        {
            trace("framePhotoLoadedHandler()");

        }// end function

    }// end function

}// end function

接下来,在您的Configurator类中,我导入了FramedPhoto类,声明并实例化了它。然后,我向其添加了一个事件侦听器,该侦听器侦听从framePhoto显示对象调度的事件并调用framedPhotoLoadedHandler()。

代码语言:javascript
复制
package com 
{ 
    import flash.display.Sprite;
    import flash.events.Event;

    public class FramedPhoto extends Sprite 
    {
        public static const FRAMED_PHOTO_LOADED = 'framedPhotoLoaded';

        public function FramedPhoto():void
        {
            addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);

        }// end function

        private function addedToStageHandler(e:Event):void
        {
            dispatchEvent(new Event(FRAMED_PHOTO_LOADED, true));

        }// end function

    }// end function

}// end function

最后,在FramePhoto类中,我向其添加了一个事件侦听器,用于侦听何时将FramePhoto显示对象添加到舞台中。当它被添加到舞台上时,它将调用addedToStageHandler(),该方法将分派事件,并将在父配置器显示对象中捕获。

我希望这能有所帮助:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4364839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档