徹夜明けの終電帰りでクタクタになって帰ってきた癖に 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の流れを考えてたらできた。