ActionScript 3名称属性未返回正确的名称...?

时间:2009-04-03 22:49:19

标签: actionscript-3 properties

我在as3中遇到了name属性的问题,我创建了这个“dot”movieclip并导出到了一个类, 然后我使用循环匿名创建了一堆点。我为每个点分配了数字作为名称

private function callDots(num:Number):void
    {                
        for (var i = 0; i < subImagesTotal[num]; i++)
        {
            var d:Dot = new Dot();
            d.x = i*23;
            d.y = 0;

            d.name = i;
            dotContainer.addChild(d]);
        }
    }  

到目前为止一直很好,我检查过如果我在这里追踪这个名字,我会得到我想要的号码。 但是,如果我在其他功能中跟踪它,它不会给我数字。 我将所有的点添加到“dotContainer”,如果我点击其中一个点,它将调用此函数

private function callFullSub(e:MouseEvent):void
   {
        var full_loader:Loader = new Loader();
        var temp:XMLList = subImages[sub];
        var full_url = temp[e.target.name].@IMG;

        full_loader.load(new URLRequest(full_url));
        full_loader.contentLoaderInfo.addEventListener(Event.INIT, fullLoaded);
    }  

e.target.name被认为是1或2之类的数字,但它给了我“instance66”“instance70”而我 不知道为什么。因为我以前用装载机做了同样的事情而且它完全奏效了。 有任何想法吗?感谢。

5 个答案:

答案 0 :(得分:2)

e.target返回点击的最内层对象,这可能是一个TextField,另一个MovieClip,或者说是“Dot”中的一个形状(我不是最后一个的100%)。

为了防止这种情况,您可以尝试在添加它们时将Dot的mouseChildren属性设置为false。这应该确保点内的任何内容都不能发送点击事件,因此Dot应该这样做。

也许您也可以在事件处理程序中使用以下代码验证目标类型:

private function callFullSub(e:MouseEvent):void
{
    if(!e.target is Dot)
        throw new Error("target in callFullSub is not Dot but: " + e.target.toString());

    //The rest of you code here
}

答案 1 :(得分:2)

答案是[e.currentTarget.name]我一直这样做!

应返回“Dot1”“Dot2”等

如果要返回的值是数字或除字符串(对象名称)以外的其他数据类型,请使用[e.currentTarget.name.substr(3,1).toString()]

应该返回1,2等

Navee

答案 2 :(得分:1)

我尝试首先使用Flex使用运行时创建的movieClip重现您的问题,然后使用Flash导出为ActionScript导出的Dot movieClip符号。两个应用程序都没有出现问题。

您可能已经知道“instance66”“instance70”这样的名称是默认的枚举实例名称。因此,无论调度MouseEvent是不是点实例。也许你是无意中将callFullSub分配给错误的目标,也许是你的容器?尝试在创建它们后立即将其分配给点实例,如下所示:

private function callDots(num:Number):void
{                
    for (var i = 0; i < subImagesTotal[num]; i++)
    {
        var d:Dot = new Dot();
        d.x = i*23;
        d.y = 0;

        d.name = i;
        d.addEventListener(MouseEvent.CLICK, callFullSub);
        dotContainer.addChild(d]);
    }
}

请务必暂时将您的原始作业注释掉。

答案 3 :(得分:1)

尝试这可能有用,..

d.name = i.toString(); 

答案 4 :(得分:0)

您没有向我展示足够的代码以便能够给您一个明确的答案,但我会这样说。

//After you create each loader you need to set its mouseEnabled
//property to false if you do not want it to be the target of
//Mouse Events, which may be superseding the actual intended target;

var full_loader:Loader = new Loader();
full_loader.mouseEnabled = false;
//Also you could name the loaders and see if what comes back when you click is the same.

也!将其添加到CLICK或MOUSE_DOWN的鼠标事件处理程序:

trace(e.target is Loader);  //If traces true you have an answer

我相信装载机正在调度鼠标事件。

请提供更多代码,即Loader.contentLoaderInfo的COMPLETE处理程序触发的代码。我假设这是你将加载器添加到显示列表的地方,因为我现在看不到。