徹夜明けの終電帰りでクタクタになって帰ってきた癖に FlashのMovieClipにgetElementByIdを実装してみた。
明示的にidをつけてやり できればclassもつけてやり tagはinstanceofにあたるかな?独自クラスではきっちりクラス名を返すようにしないとだけど ここまでやれば
MovieClip.getElementById
MovieClip.getElementsByTagName
MovieClip.getElementsByClassName
MovieClip.getElementsByTagName
MovieClip.getElementsByClassName
として使えて、もうウハウハの萌え萌えだ。 Mediatorパターン関連もしこんでもいいな。 ビバ組み込みクラス汚染。
で、
MovieClip.prototype.getElementById = function(refId){
// 再帰的に検索 めんどいから略
return targetElement;
};
// 再帰的に検索 めんどいから略
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.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の流れを考えてたらできた。