JavaScript から使用できる ActionScript オブジェクトの作成

Adobe AIR 1.0 およびそれ以降

HTMLLoader オブジェクトによって読み込まれる HTML ページ内の JavaScript は、HTML ページの window.runtime プロパティ、 window.htmlLoader プロパティおよび window.nativeWindow プロパティを使用して ActionScript の実行コンテキストに定義されたクラス、オブジェクトおよび関数を呼び出すことができます。JavaScript の実行コンテキスト内に ActionScript のオブジェクトと関数への参照を作成することによって、JavaScript コードから使用できる ActionScript のオブジェクトと関数を作成することもできます。

ActionScript から JavaScript オブジェクトにアクセスする基本のサンプル

次の例は、ActionScript オブジェクトを参照するプロパティを HTML ページのグローバル window オブジェクトに追加する方法を示しています。

var html:HTMLLoader = new HTMLLoader(); 
var foo:String = "Hello from container SWF."  
function helloFromJS(message:String):void { 
    trace("JavaScript says:", message); 
} 
var urlReq:URLRequest = new URLRequest("test.html"); 
html.addEventListener(Event.COMPLETE, loaded); 
html.load(urlReq); 
 
function loaded(e:Event):void{ 
    html.window.foo = foo; 
    html.window.helloFromJS = helloFromJS; 
}

前の例の HTMLLoader オブジェクトに読み込まれる(test.html という名前のファイル内の)HTML コンテンツは、親 SWF ファイルに定義された foo プロパティおよび helloFromJS() メソッドにアクセスできます。

<html> 
    <script> 
        function alertFoo() { 
            alert(foo);  
        } 
    </script> 
    <body> 
        <button onClick="alertFoo()"> 
            What is foo? 
        </button> 
        <p><button onClick="helloFromJS('Hi.')"> 
            Call helloFromJS() function. 
        </button></p> 
    </body> 
</html>

ドキュメントを読み込む JavaScript コンテキストにアクセスするとき、 htmlDOMInitialize イベントを使用して、ページに定義された任意のスクリプトからアクセスできるページ構成シーケンスで前もってオブジェクトを作成できます。 complete イベントを待つ場合に、追加されたオブジェクトにアクセスできるのは、ページの load イベントの後で実行されるページ内のスクリプトのみです。

JavaScript から使用できるクラス定義の作成

JavaScript で使用できるアプリケーションの ActionScript クラスを作成するために、読み込まれる HTML コンテンツを、クラス定義を含むアプリケーションドメインに割り当てることができます。JavaScript 実行コンテキストのアプリケーションドメインは、HTMLLoader オブジェクトの runtimeApplicationDomain プロパティで設定できます。アプリケーションドメインをプライマリアプリケーションドメインに設定するコードを以下に示します。ここでは、 runtimeApplicationDomain ApplicationDomain.currentDomain に設定しています。

html.runtimeApplicationDomain = ApplicationDomain.currentDomain;

runtimeApplicationDomain プロパティが設定されると、JavaScript コンテキストは割り当てられたドメインとクラス定義を共有します。JavaScript でカスタムクラスのインスタンスを作成するには、次のようにして window.runtime プロパティを通じてクラス定義を参照し、 new 演算子を使用します。

var customClassObject = new window.runtime.CustomClass();

HTML コンテンツは互換性のあるセキュリティドメインのものである必要があります。HTML コンテンツが、割り当てるアプリケーションドメインとは異なるセキュリティドメインのものである場合、そのページは代わりにデフォルトのアプリケーションドメインを使用します。例えば、インターネットからリモートページを読み込む場合、ページのアプリケーションドメインとして ApplicationDomain.currentDomain を割り当てることはできません。

イベントリスナーの削除

ランタイムオブジェクト、読み込まれた SWF コンテンツ内のオブジェクト、他のページで実行中の JavaScript オブジェクトなど、現在のページ以外のオブジェクトに JavaScript イベントリスナーを追加する場合、ページの読み込みを解除するときに必ずイベントリスナーを削除する必要があります。そうしないと、イベントリスナーは存在しなくなったハンドラー関数に対してイベントを送出します。この事象が発生すると、「The application attempted to reference a JavaScript object in an HTML page that is no longer loaded.」というエラーメッセージが表示されます。不要なイベントリスナーを削除すると、AIR が関連するメモリを再生することもできます。詳しくは、 移動する HTML ページでのイベントリスナーの削除 を参照してください。