ExternalInterfaceを使ってみる (1)

ExternalInterfaceクラスを使ってみるのだ! :boy:
JavaScript と連携できるらしい。(swf -> js)

:caution: 要 Flash Player 8 以上

This movie requires Flash Player 9.0.0

_root にムービークリップ(インスタンス名: alertBtn, quakeBtn, popupBtn, windowBtn) を配置。

_root 第1フレームに
import flash.external.ExternalInterface;

alertBtn.onRelease = function():Void {
  ExternalInterface.call("alert", "ExternalInterfaceクラスで"+"\n"+"JavaScriptを呼び出す!");
};
quakeBtn.onRelease = function():Void {
  ExternalInterface.call("earthquake");
};
popupBtn.onRelease = function():Void {
  ExternalInterface.call("popup", "popup.html", "view", 500, 200);
};
windowBtn.onRelease = function():Void {
  ExternalInterface.call("function() { window.open(‘window.html’, ‘view’, ‘width=500, height=200, toolbar=no, status=no, menubar=no, scrollbars=no, resizable=no’); void(0); }");
};
と記述。

JavaScript (swf を配置した html)
<script type="text/javascript">
  function earthquake() {
    for (i=8; i>0; i-) {
      window.moveBy(0, i);
      window.moveBy(i, 0);
      window.moveBy(0, -i);
      window.moveBy(-i, 0);
    }
  }
  function popup(f, n, w, h) {
    window.open(f, n, "width="+w+", height="+h+", toolbar=no, status=no, menubar=no, scrollbars=no, resizable=no");
  }
</script>

MacOSX 10.3.9 + Safari 1.3.2 / Firefox 1.5.0.4 の環境では、正常に機能しているよ! :doki:


:caution: ローカルで確認する場合
html の swf を表示するタグで、allowScriptAccess 属性は always にしないと、JavaScript が機能しない場合もあるようだ。 😮 ExternalInterface を用いる際には、注意しよう。


ExternalInterface (flash.external.ExternalInterface)

public class ExternalInterface extends Object

ExternalInterface クラスは外部 API であり、ActionScript と Flash Player のコンテナとの間で直接通信できるようにするアプリケーションプログラミングインターフェイスです。コンテナの例としては、JavaScript が含まれる HTML ページや、Flash Player が埋め込まれたデスクトップアプリケーションなどがあります。

ActionScript から、HTML ページ上の JavaScript 関数を呼び出し、任意のデータ型の引数の数を渡して、呼び出しから戻り値を受け取ることができます。HTML ページの JavaScript から、Flash Player の ActionScript 関数を呼び出すことができます。ActionScript 関数は値を返すことができ、JavaScript は、呼び出しの戻り値として即座にこの値を受け取ります。

使用できるバージョン
ActionScript 1.0、Flash Player 8


ExternalInterface は、次のブラウザとオペレーティングシステムの組み合わせに対応しています。
Internet Explorer 5.0 以降 (Windows), Netscape 8.0 以降 (Windows, Macintosh), Mozilla 1.7.5 以降 (Windows, Macintosh), Firefox 1.0 以降 (Windows, Macintosh), Safari 1.3 以降 (Macintosh)

call (ExternalInterface.call メソッド)

public static call(methodName:String, [parameter1:Object]) : Object

使用できるバージョン
ActionScript 1.0、Flash Player 8
パラメータ
methodName:String
コンテナ内にある呼び出し先関数の名前です。関数がパラメータを受け取る場合は、methodName パラメータの後に記述する必要があります。
parameter1:Object (オプション)
関数に渡す任意のパラメータ。任意のパラメータを指定することができ、複数のパラメータを指定する場合はカンマで区切ります。パラメータには任意の ActionScript データ型を使用できます。呼び出し先が JavaScript 関数である場合、ActionScript のデータ型は JavaScript のデータ型に自動的にマーシャリングされます。呼び出し先が何か他の ActiveX コンテナである場合、パラメータは要求メッセージの中にエンコードされます。
戻り値
Object - コンテナから受け取った応答です。呼び出しに失敗した場合は、null を返します。失敗原因としては、コンテナに該当する関数が存在しない場合、インターフェイスが利用できない場合、再帰が発生した場合、セキュリティ上の問題がある場合などがあります。


Flash Player コンテナで公開されている関数を呼び出し、必要に応じて引数を渡します。指定された関数が利用できない場合は null を返します。それ以外の場合は、関数の戻り値を返します。再帰呼び出しはできません。再帰呼び出しの場合は null を返します。

コンテナが HTML ページである場合、このメソッドは &lt;script&gt; エレメントに囲まれた JavaScript 関数を呼び出します。

コンテナが何か他の ActiveX コンテナの場合、このメソッドは、指定された名前でイベントをブロードキャストし、そのイベントはコンテナによって処理されます。

コンテナが Netscape プラグインをホストしている場合、新しい NPRuntime インターフェイス用のカスタムサポートを記述するか、HTML コントロールを埋め込んだ後にそのコントロール内に Flash Player を埋め込むことができます。HTML コントロールを埋め込んだ場合、ネイティブコンテナアプリケーションとやり取りする JavaScript インターフェイスを通じて Flash Playerと通信できます。


[追記] (07/05/09 Wed 09:23)
ローカルで確認する場合の補足を追加。