ActionScript3(AS3)のidMapはどこだ?

ActionScript3(AS3)でXMLの特定のノードにid属性を使ってアクセスするためのメモ。

AS2でいうところのidMap[]だったり、JavaScriptのgetElementById()とかと同様の処理をしようと思ったら意外にハマッてしまった。AS3の仕様が厳格なのか、それとも単なる気まぐれなのかわからないけど、一応メモ。


<body>
 <p id='123'>Hello, <b>Bob_1</b>.</p>
 <p id='124'>Hello, <b>Bob_2</b>.</p>
 <p id='125'>Hello, <b>Bob_3</b>.</p>
 <p id='126'>Hello, <b>Bob_4</b>.</p>
 <p id='127'>Hello, <b>Bob_5</b>.</p>
 <p><b><p id='128'>Hello, <b>Tom</b>.</p></b></p>
</body>

こんな感じのXMLに対してid"128"にアクセスする場合、


AS2だとこう↓
var doc:XML = new XML("<body><p id='123'>Hello, <b>Bob_1</b>.</p><p id='124'>Hello, <b>Bob_2</b>.</p><p id='125'>Hello, <b>Bob_3</b>.</p><p id='126'>Hello, <b>Bob_4</b>.</p><p id='127'>Hello, <b>Bob_5</b>.</p><p><b><p id='128'>Hello, <b>Tom</b>.</p></b></p></body>");

trace(doc.idMap['128']);//<p id="128">Hello, <b>Tom</b>.</p>


AS3だとこう↓
var doc:XML = new XML(
<body>
 <p id='123'>Hello, <b>Bob_1</b>.</p>
 <p id='124'>Hello, <b>Bob_2</b>.</p>
 <p id='125'>Hello, <b>Bob_3</b>.</p>
 <p id='126'>Hello, <b>Bob_4</b>.</p>
 <p id='127'>Hello, <b>Bob_5</b>.</p>
 <p><b><p id='128'>Hello, <b>Tom</b>.</p></b></p>
</body>

trace(doc.descendants().(attribute('id') == '128'));//<p id='128'>Hello, <b>Tom</b>.</p></b>

//trace(doc.(attribute('id') == '128'));//これだと何も返さない(空白)
//trace(doc.descendants().(@id == '128')); //これだとランタイムエラー
//trace(doc.(@id == '128')); //これもランタイムエラー
//trace(doc..(@id == '128')); //これだとコンパイルエラー

AS3の場合、子ノードや孫ノードを含めてid属性を検索する場合、descendants()が必要になるみたいです。AS2のidMapの感覚からするとdoc.(attribute('id') == '128'やdoc.(@id == '128')でアクセス出来そうな気がするけど、これは不可。
とくに@idを使った場合、同一階層の他のノードにid属性がない場合、ランタイムエラーを返すので要注意。

AS3になって、かなりXML環境が強力かつ便利になったみたいでとても格好いいな~と思っていたけど、上記の問題を解決するのに半日費やしてしまった。いまいちFlashのヘルプが貧弱な気がする。
まあとりあえず解決できたので、習作として為替レート表示Flashか天気予報Flashとかベタなコンテンツを作ってみよう。

Trackback

http://memo.kappa-lab.com/mt-tb.cgi/58

Leave your comment :

(いままで、ここでコメントしたことがないときは、コメントを表示する前に承認が必要になることがあります。そのときはしばらくお待ちください。)




RSS + Contuct

  • rss
  • email

Credit

Copyright (C) 2007 kappa-lab.com.
All Rights Reserved.