2012-03-18 64 views
0

我知道有作爲getElementByName Flex中沒有這樣的功能,但我也現在你可以做到這一點[「OBJECT_ID」]獲取應用程序你就像的元素英寸 什麼裏面得到一個元素另一個元素? 我試過製作element["id"]?但是在我的try-catch中,它總是運行「catch」部分= \ 所以:我如何在另一個元素中獲取一個元素,並將它的id設置爲動態創建的字符串形式?的Flex getElementByName

預先感謝您

回答

3

這取決於你試圖訪問什麼樣的元素。

  1. 子顯示對象可以通過調用DisplayObjectContainer#getChildByName訪問:
    element.getChildByName("name");

  2. 公共變量(其可以被設置成也包含一個子顯示對象)可通過使用bracket syntax訪問:
    element["name"];

    ,或者乾脆利用dot syntaxelement.name

(其中name是您嘗試訪問的屬性的名稱)。

請注意,如果您在導出設置中選中了「自動聲明階段實例」選項,則任何您拖動到Flash IDE中的舞臺的實例都將爲automatically be assigned to a public variable。這就是使用this[name]的原因。

+0

我談論FLEX這裏,沒有舞臺等等。我也在談論UIComponent對象,它沒有孩子,但元素。僅供參考,我現在正在使用TabNavigator。 – 2012-03-18 16:43:36

+0

那麼,這是很好的信息 - 也許你應該在下次你的問題時加上這個。無論如何,請查看UIComponent和* tada *的信息:它是DisplayObjectContainer的子類... http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html#getChildByName () – weltraumpirat 2012-03-18 23:43:05

+0

而僅供參考它*有*有孩子。 – weltraumpirat 2012-03-18 23:43:45

0

如果我理解正確,您需要一種方法來獲取具有特定名稱的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> 

在這裏,我們正在尋找一切所謂的「富」,當用戶點擊「測試」按鈕的元素。

輸出:

main0.foo 
main0.foo.HBox5.foo 

你會發現,getDisplayObjectsByName()static。它所做的只是遍歷顯示列表(深度優先),並挑選出具有指定名稱的所有對象。

+0

我現在沒有可能測試它,但我提前感謝你!順便說一下,我只想在第一級兒童中獲得「foo」元素。所以只是VBox =)我認爲我只需要刪除最後一條if語句,對吧? ;) – 2012-03-19 09:19:57

+0

@AndreaSilvestri我已將名稱更改爲「getDisplayObjectsByName」,以反映我們正在尋找「DisplayObject」而不是「元素」(如XML元素)的事實,並且還添加了一個'recurse'參數,它在默認情況下是'true'。 – Manish 2012-03-19 17:59:59

0

如果你在一個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);    
}