AS1MovieClipクラスの問題点
前回のエントリに引き続いて、AS1MovieClipクラスについて。
as1な手軽さで書けるようにと onEnterFrame などのイベントハンドラを setter で処理したのはいいものの、イベントハンドラを解除する時の以下の記述
delete mc.onEnterFrame;
を setter で自動検出できないのが痛い!
とTwitterでぼやいていたら、BeInteractiveの人に「setterがある時点で、dynamicなプロパティとしては扱われていない(と思う)ので、deleteは出来ない気がします。」と言われた。
そりゃそーだ。
でも、deleteできるできないに関わらず、Proxyクラスを継承しない限りは自動検出する術がなさそう。
もちろん、以下の方法だとちゃんと解除できる。
mc.onEnterFrame = null;
多重継承ができれば解決するんだけどな。
ENTER_FRAME でチェックするにしてもタイミングのズレで思わぬバグが発生しかねないので、とりあえず delete は禁止の方向で。
もうひとつ、as1では親がボタン化すると子のボタンが無効化するという仕様があるのですが、これをas3で再現するのがめちゃくちゃ難しい!
イベントはデフォルトではバブリング段階で処理されるので、stopPropagationで親に伝播するのを止めることはできても、子に伝播するのを親が止めることはできない。
それならキャプチャ段階で監視すればいいかというと、そうは問屋が卸さない。
キャプチャを有効にしてリスナ登録すると、キャプチャフェーズだけでイベント伝播が終了してしまうためターゲットにまでイベントがこない。
さて、どうしたものか…親がボタン化しているのかどうかわざわざ問い合わせるメソッド用意しなきゃいけないのかなあ。
処理的に美しくないので避けたいところだけど、他に方法がなければそうするしかないかな。


