OnEnterFrameBeacon の落とし穴

OnEnterFrameBeacon は便利なことこの上ないが、_root の深度 9876 に __OnEnterFrameBeacon という MovieClip が作成される仕様を理解しておきたい。

親 SWF ファイル (MovieClip) が、子 SWF ファイル (MovieClip) を読み込む構成の Flash サイトを構築する際、子の内部で OnEnterFrameBeacon を使用していると、_root である親の方に __OnEnterFrameBeacon が作成される。そのため、子を unloadMovie() や removeMovieClip() で削除しても、子が作成した onEnterFrame() イベントが発生し続けるという問題が起こる。これにより、単体テストで動いてたものが結合テストで急に動かなくなったりと、意外なところで不具合が生じる。

この問題に対する回避策は幾つか考えられる。

  • 子の _lockroot を true にする。
  • 子の onUnload() イベント発生時に removeListener() を明示的に行う。

まず前者は、_lockroot プロパティを true にすることによって、__OnEnterFrameBeacon が子の中に作られるようになる。つまり、子 SWF ファイルが存在しなくなった時点で、同時にイベントもクリアされる。

しかし、こちらは loadMovie() で子を読み込む場合のみ有効で、attachMovie() を使用するような、_root が 1 つ (SWF ファイルが 1 つ) で完結する構成では意味を成さない。

次に後者。onUnload() イベントは、unloadMovie() や removeMovieClip() 実行時に発生する。イベントハンドラを記述する分、コードが冗長になるが、どの状況でも正確な動作が期待できる。勿論、onUnload() イベントのタイミングに限らず、不要になったリスナは、その時点で削除すべきだろう。