パッケージflash.external
public final class ExternalInterface
継承ExternalInterface Inheritance Object

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

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

この機能は以前の fscommand() メソッドに代わるものです。

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 

ExternalInterface を利用するには、ユーザーの Web ブラウザが、一部のブラウザによってプラグインスクリプトとして公開されている ActiveX または NPRuntime API のいずれかをサポートしている必要があります。http://www.mozilla.org/projects/plugins/npruntime.html を参照してください。

メモ : HTML ページに SWF ファイルを埋め込む場合、<object> タグと <embed> タグの id 属性と name 属性に次の文字が含まれていないことを確認します。(.)、-、+、*、/、および \。

ActionScript から、HTML ページに対して次のことを実行できます。

HTML ページの JavaScript から、次のことを実行できます。

メモ : Flash Player は現在、HTML フォームに埋め込まれた SWF ファイルをサポートしていません。

例の表示

関連項目

flash.system.fscommand()
ExternalInterface API を使用した Flex から JavaScript へのアクセス
JavaScript からの Flex へのアクセス
Flex における ExternalInterface API セキュリティについて
External API について
ExternalInterface クラスの使用


パブリックプロパティ
 プロパティ定義
  available : Boolean
[static][read-only] この Player が外部インターフェイスを備えたコンテナに含まれているかどうかを示します。
ExternalInterface
 Inheritedconstructor : Object
特定のオブジェクトインスタンスのクラスオブジェクトまたはコンストラクタ関数への参照です。
Object
  objectID : String
[static][read-only] Internet Explorer の <object> タグの id 属性を返すか、または Netscape の <embed> タグの name 属性を返します。
ExternalInterface
 Inheritedprototype : Object
[static] クラスまたは関数オブジェクトのプロトタイプオブジェクトへの参照です。
Object
パブリックメソッド
 メソッド定義
  addCallback(functionName:String, closure:Function):void
[static] ActionScript メソッドをコンテナから呼び出し可能なものとして登録します。
ExternalInterface
  call(functionName:String, ... arguments):*
[static] Flash Player コンテナで公開されている関数を呼び出し、必要に応じて引数を渡します。
ExternalInterface
 InheritedhasOwnProperty(name:String):Boolean
オブジェクトに指定されたプロパティが定義されているかどうかを示します。
Object
 InheritedisPrototypeOf(theClass:Object):Boolean
Object クラスのインスタンスが、パラメータとして指定されたオブジェクトのプロトタイプチェーン内にあるかどうかを示します。
Object
 InheritedpropertyIsEnumerable(name:String):Boolean
指定されたプロパティが存在し、列挙可能かどうかを示します。
Object
 InheritedsetPropertyIsEnumerable(name:String, isEnum:Boolean = true):void
ループ処理に対するダイナミックプロパティの可用性を設定します。
Object
 InheritedtoString():String
指定されたオブジェクトのストリング表現を返します。
Object
 InheritedvalueOf():Object
指定されたオブジェクトのプリミティブ値を返します。
Object
プロパティの詳細
availableプロパティ
available:Boolean  [read-only]

この Player が外部インターフェイスを備えたコンテナに含まれているかどうかを示します。外部インターフェイスが利用できる場合、このプロパティは true になります。利用できない場合には false になります。

メモ : HTML で外部 API を使用する場合、JavaScript メソッドを呼び出す前には常に、HTML が完全にロードされていることを確認する必要があります。

実装
    public static function get available():Boolean

関連項目



次の例では、available プロパティを使用して、外部インターフェイスを備えたコンテナ内に Player が含まれているかどうかを決定します。
  package {
    import flash.text.TextField;
    import flash.display.MovieClip;
    import flash.external.ExternalInterface;
  
    public class extint_test extends MovieClip {
      public function extint_test() {
        var isAvailable:Boolean = ExternalInterface.available;
        var availTxt:TextField = new TextField();
        availTxt.text = isAvailable.toString();
        addChild(availTxt);
      }
    }
  }
  

objectIDプロパティ 
objectID:String  [read-only]

Internet Explorer の <object> タグの id 属性を返すか、または Netscape の <embed> タグの name 属性を返します。

実装
    public static function get objectID():String

関連項目

メソッドの詳細
addCallback()メソッド
public static function addCallback(functionName:String, closure:Function):void

ActionScript メソッドをコンテナから呼び出し可能なものとして登録します。addCallBack() の呼び出しが成功すると、Flash Player 内に登録されている関数をコンテナ内の JavaScript や ActiveX から呼び出すことができます。

パラメータ
functionName:String — コンテナが関数を呼び出すことができる名前です。
 
closure:Function — 呼び出す関数閉包です。これは独立した関数にすることも、オブジェクトインスタンスのメソッドを参照するメソッド閉包とすることもできます。メソッド閉包を渡すことで、特定のオブジェクトインスタンスのメソッドでコールバックを実際にダイレクトできます。

スロー
Error — コンテナが入呼をサポートしない場合、エラーがスローされます。これは Windows 用の Internet Explorer、Mozilla 1.7.5 以降、または Firefox 1.0 以降のような NPRuntime API を使用するブラウザでのみサポートされます。
 
SecurityError — 指定された名前を使用したコールバックが、アクセスしていない Sandbox 内で既に ActionScript によって追加されています。このコールバックを上書きできません。これは、最初に addCallback() メソッドを呼び出した ActionScript が Security.allowDomain() メソッドも呼び出すようにすることによって回避できる場合があります。
 
SecurityError — コンテナ環境がセキュリティサンドボックスに属しているために、呼び出し側のコードにアクセス権がありません。この問題を解決するために、次のことを実行します。
  1. 含まれている HTML ページ内の SWF ファイルの <object> タグで、次のパラメータを設定します。

    <param name="allowScriptAccess" value="always" />

  2. SWF ファイルで、次の ActionScript を追加します。

    flash.system.Security.allowDomain(sourceDomain)

関連項目

call()メソッド 
public static function call(functionName:String, ... arguments):*

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

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

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

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

パラメータ
functionName:String — コンテナ内にある呼び出し先関数の名前です。
 
... arguments — コンテナ内の関数に渡される引数です。任意のパラメータを指定することができ、複数のパラメータを指定する場合はカンマで区切ります。パラメータには任意の ActionScript データ型を使用できます。呼び出し先が JavaScript 関数である場合、ActionScript のデータ型は JavaScript のデータ型に自動的に整列化されます。呼び出し先が他の ActiveX コンテナである場合、パラメータは要求メッセージの中にエンコードされます。

戻り値
* — コンテナから受け取った応答です。呼び出しに失敗した場合は、null が返され、エラーがスローされます。失敗原因としては、コンテナに該当する関数が存在しない場合、インターフェイスが利用できない場合、再帰が発生した場合、セキュリティ上の問題がある場合などがあります。

スロー
Error — コンテナが発呼をサポートしない場合、エラーがスローされます。これは Windows 用の Internet Explorer、Mozilla 1.7.5 以降、または Firefox 1.0 以降のような NPRuntime API を使用するブラウザでのみサポートされます。
 
SecurityError — コンテナ環境がセキュリティサンドボックスに属しているために、呼び出し側のコードにアクセス権がありません。これを回避するには、コンテナの環境において、allowScriptAccess (通常、HTML の allowScriptAccess <object>/<embed> タグ) に適切な値を設定します。

関連項目


次の例では、Flash Player および HTML コンテナ間でデータを送信する方法を示します。

package {
    import flash.display.Sprite;
    import flash.events.*;
    import flash.external.ExternalInterface;
    import flash.text.TextField;
    import flash.utils.Timer;
    import flash.text.TextFieldType;
    import flash.text.TextFieldAutoSize;

    public class ExternalInterfaceExample extends Sprite {
        private var input:TextField;
        private var output:TextField;
        private var sendBtn:Sprite;

        public function ExternalInterfaceExample() {
            input = new TextField();
            input.type = TextFieldType.INPUT;
            input.background = true;
            input.border = true;
            input.width = 350;
            input.height = 18;
            addChild(input);

            sendBtn = new Sprite();
            sendBtn.mouseEnabled = true;
            sendBtn.x = input.width + 10;
            sendBtn.graphics.beginFill(0xCCCCCC);
            sendBtn.graphics.drawRoundRect(0, 0, 80, 18, 10, 10);
            sendBtn.graphics.endFill();
            sendBtn.addEventListener(MouseEvent.CLICK, clickHandler);
            addChild(sendBtn);

            output = new TextField();
            output.y = 25;
            output.width = 450;
            output.height = 325;
            output.multiline = true;
            output.wordWrap = true;
            output.border = true;
            output.text = "Initializing...\n";
            addChild(output);

            if (ExternalInterface.available) {
                try {
                    output.appendText("Adding callback...\n");
                    ExternalInterface.addCallback("sendToActionScript", receivedFromJavaScript);
                    if (checkJavaScriptReady()) {
                        output.appendText("JavaScript is ready.\n");
                    } else {
                        output.appendText("JavaScript is not ready, creating timer.\n");
                        var readyTimer:Timer = new Timer(100, 0);
                        readyTimer.addEventListener(TimerEvent.TIMER, timerHandler);
                        readyTimer.start();
                    }
                } catch (error:SecurityError) {
                    output.appendText("A SecurityError occurred: " + error.message + "\n");
                } catch (error:Error) {
                    output.appendText("An Error occurred: " + error.message + "\n");
                }
            } else {
                output.appendText("External interface is not available for this container.");
            }
        }
        private function receivedFromJavaScript(value:String):void {
            output.appendText("JavaScript says: " + value + "\n");
        }
        private function checkJavaScriptReady():Boolean {
            var isReady:Boolean = ExternalInterface.call("isReady");
            return isReady;
        }
        private function timerHandler(event:TimerEvent):void {
            output.appendText("Checking JavaScript status...\n");
            var isReady:Boolean = checkJavaScriptReady();
            if (isReady) {
                output.appendText("JavaScript is ready.\n");
                Timer(event.target).stop();
            }
        }
        private function clickHandler(event:MouseEvent):void {
            if (ExternalInterface.available) {
                ExternalInterface.call("sendToJavaScript", input.text);
            }
        }
    }
}


上記の ActionScript コードをテストするには、次の HTML テンプレートを使用して、生成された SWF ファイルを埋め込みます。
 <!-- saved from url=(0014)about:internet -->
 <html lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>ExternalInterfaceExample</title>
 <script language="JavaScript">
     var jsReady = false;
     function isReady() {
         return jsReady;
      }
     function pageInit() {
         jsReady = true;
         document.forms["form1"].output.value += "\n" + "JavaScript is ready.\n";
      }
     function thisMovie(movieName) {
         if (navigator.appName.indexOf("Microsoft") != -1) {
             return window[movieName];
         } else {
             return document[movieName];
          }
      }
     function sendToActionScript(value) {
         thisMovie("ExternalInterfaceExample").sendToActionScript(value);
      }
     function sendToJavaScript(value) {
         document.forms["form1"].output.value += "ActionScript says:" + value + "\n";
      }
 </script>
 </head>
 <body onload="pageInit();">
  
     <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
             id="ExternalInterfaceExample" width="500" height="375"
             codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
         <param name="movie" value="ExternalInterfaceExample.swf" />
         <param name="quality" value="high" />
         <param name="bgcolor" value="#869ca7" />
         <param name="allowScriptAccess" value="sameDomain" />
         <embed src="ExternalInterfaceExample.swf" quality="high" bgcolor="#869ca7"
             width="500" height="375" name="ExternalInterfaceExample" align="middle"
             play="true" loop="false" quality="high" allowScriptAccess="sameDomain"
             type="application/x-shockwave-flash"
             pluginspage="http://www.macromedia.com/go/getflashplayer">
         </embed>
     </object>
  
     <form name="form1" onsubmit="return false;">
         <input type="text" name="input" value="" />
         <input type="button" value="Send" onclick="sendToActionScript(this.form.input.value);" /><br />
         <textarea cols="60" rows="20" name="output" readonly="true">Initializing...</textarea>
     </form>
  
 </body>
 </html>
  






 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flex/2_jp/langref/flash/external/ExternalInterface.html