FlashとJavaScriptの連携(2) - JavaScriptからswfを制御

HTML内にswfを表示しているときに、HTML内に記述したJavaScriptからswfの再生状態を制御したり、swf何らかのデータを渡してその動作を変化させたい場面が良くある。ここではJavaScriptからswf(ActionScript)を制御する場合の簡単な実装例を紹介する。この方法はJavaScriptを介してHTML内に表示した複数の異なるswfムービー間で通信することにも応用される。

関連項目:swfからJavaScriptを制御

JavaScriptからswfを制御

JavaScriptからswfの制御はPluginまたはActiveXオブジェクトに用意された様々なメソッドを用いることで、ムービー再生の開始・停止[Play()/Stop()/Rewind()/GotoFrame(int frameNum)] や、パンやズーム[Zoom(int percent)/Pan(int x, int y, int mode)]、swf内の指定した変数/プロパティ値の設定・取得[SetVariable(String name, String value)/GetVariable(String name)/TSetProperty(String target, int property, String value)/TGetProperty(String target, int property)]、フレームアクションの呼び出し[TCallFrame(String target, int frameNum)TCallLabel(String target, String label)]等まで、細かに制御することが可能である。

しかしながら、JavaScriptからムービークリップのプロパティ等の細部を直接制御するよりは、swfにテキストメッセージを送り、それによってswfを制御する(適当なプロトコルを用いて通信・制御を行う)ように構成した方が移植性が高く好ましい。実際に良く使うのはJavaScriptから指示を送ってswf内に用意したアクションを開始させる(トリガ)、またはデータ(パラメータ)を送る処理である。SetVariableを用いる例を紹介する。

JavaScriptからFlashオブジェクトのメソッドを呼び出すには以下のHTML修正が必要である。

(1)FlashPlayerオブジェクトのnameおよびid属性の設定 (2)FlashPlayerオブジェクトのswfLiveConnect属性の有効化

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 
     codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"
     id="movie" width="480" height="360">
 <param name=movie value="movie.swf">
 <param name=quality value=high>
 <param name=bgcolor value=#FFFFFF>
 <embed src="movie.swf" quality=high bgcolor=#FFFFFF width="480" height="360"
     swLiveConnect="true" id="movie" name="movie"
     type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">
 </embed>
 </object>
<script Language="JavaScript">
 function setCookie() { 
     // ブラウザによって制御すべきオブジェクトが異なるためブラウザ名で判定
    var swfMovie = (navigator.appName.indexOf("Microsoft") != -1) ? movie : document.movie;
     swfMovie.SetVariable("_level0.strCookie", document.cookie);
 } 
 </script>
 <input type=button value="SET" onClick="setCookie()">

InternetExplorerとその他のブラウザでは、Flash表示に用いられるオブジェクトが、それぞれActiveXオブジェクトまたはFlashプラグインと異なり、HTMLのDOM(Document Object Model)のパスも異なる。そのためブラウザのアプリケーション名で判定を行いメソッドを呼び出すべきオブジェクトのインスタンスを取得する必要がある。

swf制御のセキュリティ

swfファイルとHTMLファイルの置かれているサーバー(ドメイン)が異なる場合は、セキュリティ上の制限がありデフォルトではHTML内スクリプトからムービーを制御出来ないようになっている。制御を許可するにはActionScriptにおいてSystemオブジェクトに対して下記のようにHTMLの置かれているサーバードメインを許可ドメインに設定する。

System.security.allowDomain("www.dawgsdk.org");