【问题标题】:Flex getElementByNameFlex getElementsByName
【发布时间】:2012-03-18 01:17:57
【问题描述】:

我知道 Flex 中没有 getElementByName 这样的功能,但我现在也可以这样做[“object_id”] 来获取你所在的应用程序的元素。 如何在另一个元素中获取一个元素? 我试过制作 element["id"] 吗?但在我的 try-catch 中,它总是运行“catch”部分 =\ 那么:如何在另一个元素中获取一个元素,而它的 id 是动态创建的字符串形式?

提前谢谢你

【问题讨论】:

    标签: actionscript-3 apache-flex getelementsbytagname


    【解决方案1】:

    这取决于您尝试访问的元素类型。

    1. 可以通过调用DisplayObjectContainer#getChildByName访问子显示对象:
      element.getChildByName("name");

    2. 可以使用bracket syntax:
      element["name"]; 访问公共变量(也可以设置为包含子显示对象)

      或者干脆使用dot syntax:element.name

    (其中 name 是您尝试访问的属性的名称)。

    请注意,如果您在导出设置中选中了“自动声明阶段实例”选项,那么您在 Flash IDE 中拖动到阶段的任何实例都会automatically be assigned to a public variable。这就是为什么使用this[name]works 的原因。

    【讨论】:

    • 我在这里说的是 FLEX,没有舞台。我也在谈论没有子元素但元素的 UIComponents 对象。仅供参考,我现在正在使用 TabNavigator。
    • 嗯,这是很好的信息 - 也许您应该在下次将其添加到您的问题中。无论如何,请查看 UIComponent 和 tada 的信息:它是 DisplayObjectContainer 的子类...help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…
    • 而且仅供参考,它确实有孩子。
    • 在 Flex 中,即使您不幸使用 DisplayObjectContainers,也不确定 addChild getChild removeChild 是否有效......
    【解决方案2】:

    如果我理解正确,您是在寻找一种方法来获取 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。它所做的只是遍历显示列表(深度优先)并挑选出所有具有指定名称的对象。

    【讨论】:

    • 我现在无法测试它,但我提前谢谢你!顺便说一句,我只想在第一级儿童中获得“foo”元素。所以只是 VBox =) 我认为我只需要删除最后一个 if 语句,对吗? ;)
    • @AndreaSilvestri 我已将名称更改为“getDisplayObjectsByName”以反映我们正在寻找DisplayObjects,而不是“元素”(如 XML 元素)的事实,并且还添加了一个 @ 987654326@参数,默认为true
    【解决方案3】:

    如果你正在寻找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);               
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2014-12-08
      • 2016-01-01
      • 2011-02-28
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多