我知道 Flex 中没有 getElementByName 这样的功能,但我现在也可以这样做 ["object_id"] 来获取您所在的应用程序的元素。在另一个元素中获取一个元素怎么样?我试过制作element["id"]
?但是在我的 try-catch 中,它总是运行“catch”部分 =\ 所以:我如何在另一个元素中获取一个元素,而它的 id 是动态创建的字符串形式?
先感谢您
我知道 Flex 中没有 getElementByName 这样的功能,但我现在也可以这样做 ["object_id"] 来获取您所在的应用程序的元素。在另一个元素中获取一个元素怎么样?我试过制作element["id"]
?但是在我的 try-catch 中,它总是运行“catch”部分 =\ 所以:我如何在另一个元素中获取一个元素,而它的 id 是动态创建的字符串形式?
先感谢您
这取决于您尝试访问的元素类型。
可以通过调用DisplayObjectContainer#getChildByName访问子显示对象:
element.getChildByName("name");
可以使用括号语法访问公共变量(也可以设置为包含子显示对象):
element["name"];
或简单地使用点语法:element.name
(其中 name 是您尝试访问的属性的名称)。
请注意,如果您在导出设置中选中了“自动声明阶段实例”选项,那么您在 Flash IDE 中拖动到阶段的任何实例都将自动分配给一个公共变量。这就是使用this[name]
工作的原因。
如果你正在寻找 a 中的元素Group
,你可以使用这个函数:
static function getElementByName(group:GroupBase, name:String):IVisualElement {
const child:DisplayObject = group.getChildByName(name);
const index:int = group.getChildIndex(child);
return group.getElementAt(index);
}
如果我理解正确,您是在寻求一种方法来获取 Flex 应用程序中具有特定名称的所有“元素”。
这是一个示例(Flex 3):
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*">
<mx:Script>
<![CDATA[
private function testIt():void
{
var arr:Array = getDisplayObjectsByName(this, "foo");
for each (var e:* in arr)
trace(e);
}
private static function getDisplayObjectsByName(node:DisplayObjectContainer,
name:String, recurse:Boolean = true):Array
{
var n:int = node.numChildren;
var a:Array = [];
for (var i:int = 0; i < n; i++) {
var c:DisplayObject = node.getChildAt(i);
if (c.name == name)
a.push(c);
if (recurse) {
if (c is DisplayObjectContainer)
a = a.concat(getDisplayObjectsByName(DisplayObjectContainer(c),
name, true));
}
}
return a;
}
]]>
</mx:Script>
<mx:VBox name="foo">
<mx:HBox>
<mx:Button name="foo" label="Test" click="testIt()" />
</mx:HBox>
</mx:VBox>
<mx:Label text="Ignore Me" />
<mx:VBox name="bar">
</mx:VBox>
</mx:Application>
在这里,当用户单击“测试”按钮时,我们正在寻找所有称为“foo”的元素。
输出:
main0.foo
main0.foo.HBox5.foo
你会注意到那getDisplayObjectsByName()
是static
. 它所做的只是遍历显示列表(深度优先)并挑选出所有具有指定名称的对象。