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

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

MovieClip.getElementById
MovieClip.getElementsByTagName
MovieClip.getElementsByClassName


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

で、

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


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

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

_level0
_level0.reserved
_level0.focusManager
_level0.focusManager.instance2
_level0.instance1
_level0.instance1.depthChild0
_level0.instance1.boundingBox_mc
_level0.z
_level0.z.c
_level0.a <- id=test
_level0.a.c

// _level0.aのonClipEvent(load)内

var id = 'testid';
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