Loaderで読み込んだswfと読み出し元swf間のイベント伝達

Loaderに外部のswfを読み込んだ状態で、LoaderにMouseEvent.CLICKのイベントリスナーを設定しても反応しない、という現象に悩まされることが多々あります。

Loaderは、InteractiveObjectを継承しているので、MouseEventは受け取れるはずです。それに、Loaderにスタティックな画像(jpegやpngなど)を読み込んだ際には、LoaderにMouseEvent.CLICKのイベントリスナーを設定すれば、イベント拾えるんですよね。

これは以前、fla.la » クロススクリプティングで紹介した

ロード元swfファイルのDisplayObjectツリーと、ロードしたswfファイルのDisplayObjectツリー間のイベント伝達フロー

が関係してきます。

そこでAdobe ActionScript 3.0 * クロススクリプトを読んでみますと、以下の記述があります。

  1. 親オブジェクトを所有する SWF ファイルは、ソースオブジェクトを所有する SWF ファイルのドメインを信頼するために、Security.allowDomain() メソッドを呼び出す必要があります。
  2. ソースオブジェクトを所有する SWF ファイルは、親オブジェクトを所有する SWF ファイルのドメインを信頼するために、Security.allowDomain() メソッドを呼び出す必要があります。

つまり読み込んだexample.com/hoge.swfからexample.net/fugo.swfを読み込んで、イベント伝達を可能にするためには、お互いのドメインを引数にしたSecurity.allowDomain()を実行する必要があるということになります。

サンプルソース

サンプルをwonderflに上げておきました。中央付近に表示されるキャラクターにMouseEvent.CLICKイベントのリスナーを登録していますが、クリックしても反応しません。

キャプチャーフェーズ、ターゲットフェーズ、バブリングフェーズすべてのフェーズでイベントが発生していないことがポイントです。

そこで、上部にある「Security.allowDomain()」というボタンをクリックしたあとで、キャラクターをクリックすると反応することが分かると思います。

なお、http://asmple.com/work/avatar3.swfでは以下のSecurity.allowDomain()が記述してあります。

Security.allowDomain("wonderfl.net");
Security.allowDomain("swf.wonderfl.net");