Flash AS3-如何在事件处理程序函数中获取对象的名称?

Flash AS3-如何在事件处理程序函数中获取对象的名称?,flash,actionscript-3,actionscript,Flash,Actionscript 3,Actionscript,下面是我的AS3代码: public function load_swfs(event:Event) { var loader:Loader = event.target.getChildAt(0) as Loader; var mc:MovieClip = loader.content as MovieClip; var mc_name = 'somethingGeneratedElsewhere'; this.a

下面是我的AS3代码:

    public function load_swfs(event:Event)
    {
        var loader:Loader = event.target.getChildAt(0) as Loader;
        var mc:MovieClip = loader.content as MovieClip;
        var mc_name = 'somethingGeneratedElsewhere';
        this.animations[mc_name] = mc;
    }

    // --------------------------------------------------------------------
    public function add(mc_name)
    {
        //this.animations is a object that holds a bunch of dynamically loaded SWF files.
        addChild(this.animations[mc_name]);
        this.animations[mc_name].addEventListener(Event.ENTER_FRAME, enter_frame_handler);
    }

    // --------------------------------------------------------------------
    public function enter_frame_handler(e:Event)
    {
       //how do I get mc_name in this function
       // Example, if I run add('movie123'). How do I get 'movie123' in this function?
    }
如果我运行add('movie123')。如何在enter\u frame\u处理程序函数中获取字符串“movie123”

更新


这个论坛帖子()描述了我遇到的问题,但没有提供我想要的解决方案。幸运的是@kapep提供了一个简单的解决方案,解决了这个问题。

您首先需要命名电影剪辑,然后可以使用
e.currentTarget.name
检索它们的名称:

public function eventListener(e:Event)
{
    var target:MovieClip = (e.target as MovieClip);
    // Target is the object that dispatched the event.
}
// --------------------------------------------------------------------
public function add(mc_name)
{
    //this.animations is a object that holds a bunch of dynamically loaded SWF files.
    addChild(this.animations[mc_name]);
    this.animations[mc_name].name = mc_name; // IMPORTANT - name the MovieClip
    this.animations[mc_name].addEventListener(Event.ENTER_FRAME, enter_frame_handler);
}

// --------------------------------------------------------------------
public function enter_frame_handler(e:Event)
{
    trace(e.currentTarget.name);
}

其他解决方案通常是更好的选择。如果不能动态添加属性,仍然可以使用


无论如何,请记住,
this.animations[mc_name]
实际上并没有使用movieclips名称,并且不可能以这种方式获取变量名称。如果你想做
this.animations[some_other_name]=this.animations[mc_name]将有两个变量引用同一个对象。没有办法知道使用了哪个变量来附加侦听器。因此,请确保您理解movieclip名称与其变量名称之间的区别。

或者,如果您要查找其索引,可以使用这一行


跟踪(stage.getChildIndex(MovieClip(event.target))

返回一个movieclip。我需要字符串格式的名称。如果
this.animations['awesomeMovie']
那么我需要在
enter\u frame\u处理程序中获取'awesomeMovie'。可能吗?我试过了
e.target.name`并得到了
instance5
或类似的东西。你能把代码贴到你把它添加到
this.animations
集合的地方吗?
e.target.name
属性与您在代码中使用的名称是分开的。还有,你打算怎么处理这根绳子?请记住,
this.animations[“awesomeMovie”]
在本例中指的是与
e.target
相同的对象。我尝试了这个方法,得到了
Error\2078:无法修改时间线放置对象的name属性。
如果它们直接在时间线上创建,则需要在那里命名它们。只需在“属性”面板中设置“实例名称”属性。如果他们已经有了一个名字,你应该能够通过
trace(e.currentTarget.name)获得它我想在代码中完成这一切。另外,我加载的外部SWF文件中没有任何actionscript。我找到了一个解决办法,我很快就会发布。谢谢您的帮助。是的,我无法动态添加
.name
属性,因此您的解决方案非常有效。您说过其他解决方案更好,这样做有什么大的缺点吗?@zechdc在大多数情况下,使用对象而不是名称更好。通常
e.target
e.currentTarget
是您所需要的全部。这样比较干净,是环岛。与使用字典相比,访问对象的属性更可取(而且速度更快,但在本例中不会太快)。由于您无法编辑MovieClips的
name
属性,因此最好的方法可能是将时间线对象包装到另一个对象中,并使用您可以编辑的属性。与使用字典相比,将时间线对象包装到另一个对象中会有任何性能优势吗?或者优势仅仅是组织性/清晰性?任何绩效优势都很小,不值得考虑。访问类引用的属性应该总是比查询集合更快,但字典可能是一个哈希映射,因此访问时间可能是恒定的。最大的区别肯定是简洁/清晰。我尝试使用
.name
,它返回了一些系统生成的值,如
instance5
。我认为这是由于我如何加载这些外部SWF。我在上面添加了一些代码。另外,@kapep提供了一个适合我的情况的答案。谢谢你的帮助。
public function eventListener(e:Event)
{
    var target:MovieClip = (e.target as MovieClip);
    trace(target.name); // should return the name
}
private var animationNames:Dictionary = new Dictionary();

public function add(mc_name)
{
    // store animation object and the name
    animationNames[this.animations[mc_name]] = mc_name; 

    addChild(this.animations[mc_name]);
    this.animations[mc_name].addEventListener(Event.ENTER_FRAME, enter_frame_handler);
}

// --------------------------------------------------------------------
public function enter_frame_handler(e:Event)
{
    var name:String = animationNames[e.currentTarget];
    // ...
}