MovieClipに擬似getElementById

このエントリーを含むはてなブックマーク

徹夜明けの終電帰りでクタクタになって帰ってきた癖に FlashのMovieClipにgetElementByIdを実装してみた。

明示的にidをつけてやり できればclassもつけてやり tagはinstanceofにあたるかな?独自クラスではきっちりクラス名を返すようにしないとだけど ここまでやれば

  1. MovieClip.getElementById
  2. MovieClip.getElementsByTagName
  3. MovieClip.getElementsByClassName


として使えて、もうウハウハの萌え萌えだ。 Mediatorパターン関連もしこんでもいいな。 ビバ組み込みクラス汚染。

で、

  1. MovieClip.prototype.getElementById = function(refId){
  2.     //   再帰的に検索 めんどいから略
  3.     return targetElement;
  4. };


という感じだが。。 できたにはできたんだが、よくわからない問題が発生

テストは以下のような環境で

  1. _level0
  2. _level0.reserved
  3. _level0.focusManager
  4. _level0.focusManager.instance2
  5. _level0.instance1
  6. _level0.instance1.depthChild0
  7. _level0.instance1.boundingBox_mc
  8. _level0.z
  9. _level0.z.c
  10. _level0.a <- id=test
  11. _level0.a.c
  12.  
  13. // _level0.aのonClipEvent(load)内
  14.  
  15. var id = 'testid';
  16. trace(_root.getElementById('test'));


これで出力に「_level0.a」と出るはずなんだが デバッグすると確かに検索はできて、発見して、再帰処理を抜けてるんだけど traceはundefined。これじゃつかえねーじゃん。。

タイミングの問題?

arguments.calleeより外のtraceの方が先に実行されてるなんてこたーないよなぁ・・・。 うーん。

--

arguments.calleeからFunction.applyに変更

結局再帰で呼び出しているわけだから ネストした時点でreturnが返るわけない罠

うーん、どうすれば・・・。

--

あ、できた うまくいえないけど

再帰処理でINするときとOUTするときをデバッグして 再帰する流れとreturnの流れを考えてたらできた。

Posted in 日記 at 10月 19th, 2006. Trackback URI: trackback

No Responses to “MovieClipに擬似getElementById”

Leave a Reply