代码之家  ›  专栏  ›  技术社区  ›  Stein G. Strindhaug

在flash影片中获取所有命名实例

  •  0
  • Stein G. Strindhaug  · 技术社区  · 17 年前

    我想我想要的是DOM树之类的东西,或者更好的东西,比如getElementByName()在JavaScript中的工作方式。allso获取实例名称的字符串值,这样我就可以在xml中找到它的文本值。

    3 回复  |  直到 17 年前
        1
  •  2
  •   defmeta    17 年前

    @斯特林豪格

    这是相当粗糙的,但它应该做的把戏!

    private function traceAllChildren(rootContainer:DisplayObjectContainer):void {
        for(var i=0; i < rootContainer.numChildren; i++) {
            var item:* = rootContainer.getChildAt(i);
            try {
                traceAllChildren(item);
            } catch (e:Error) {
                trace(e.toString());
            }
            trace(item.toString());
            // This is the block where you can affect
            // an 'item' depending on it's type, name, etc..
            // eg: 
            //      if (item.toString() == '[object TextField]') {
            //          item.text = "The text I want to insert";
            //      }
            // or
            //      if (item.name == myTextFieldNameVar) {
            //          item.text = "The text I want to insert";
            //      }
        }
    }
    

        2
  •  1
  •   fenomas    17 年前

    简单回答:没有“内置”的方法来做到这一点。您可以尝试查找类似于getElementByName()的功能,但需要从 _root 在你的内容中穿插——严格地说,电影剪辑一开始就引用了它的子片段,但它们可能在运行时被删除,所以这可能会失败。

    尽管如此,这是一个常见的问题,有很多方法可以解决。您可能会发现更有用的一件事是创建一个附加到自定义类的自定义组件,比如“TextPlaceholder”,并让您的设计师将该组件的副本放在需要动态文本的位置。然后在运行时,该组件可以检查其 _name

        3
  •  0
  •   defmeta    17 年前

    我已经有一段时间没有做任何AS2编码了,但是也许你可以使用MovieClip.getInstanceAtDepth()和this.getNextHighestDepth()的组合来查找电影中的最高深度,然后追溯到每个较低的深度,直到找到一个getInstanceAtDepth(),它对应于要填充新数据的剪辑。

    我还注意到AS2文档中的这个示例代码。

    for (var i in this) {
        if (typeof (this[i]) == "movieclip") {
        trace("movie clip '"+this[i]._name+"' is at depth "+this[i].getDepth());
        }
    }
    

    PS:我知道你可能不想听这个,但在AS3中,这是一个很小的问题,因为你可以重复这个。孩子们!