External API の最も一般的な用途の 1 つは、ActionScript アプリケーションと Web ブラウザーとの通信です。 External API を使用すると、ActionScript メソッドから JavaScript コードへの呼び出し、および JavaScript コードから ActionScript メソッドへの呼び出しを実現できます。 ブラウザーの仕組みは複雑であり、また、ブラウザー内部で実行されるページレンダリング処理が不明であることから、HTML ページ上の JavaScript コードが最初に実行される前に SWF ドキュメントのコールバックを登録できる保証はありません。 したがって、JavaScript から SWF ドキュメントの関数を呼び出す前に、SWF ドキュメント側の接続受け付け準備ができたことを通知するために、必ず SWF ドキュメントから HTML ページへの呼び出しを実行してください。
例えば、IMManager クラスで実行される一連の手順によって、ブラウザーの通信準備ができ、SWF ファイルを通信で使用できることが、Introvert IM で判定されます。 ブラウザーの通信準備ができたことを判定する最初の手順は、次のように IMManager コンストラクターで実行されます。
public function IMManager(initialStatus:IMStatus)
{
_status = initialStatus;
// Check if the container is able to use the external API.
if (ExternalInterface.available)
{
try
{
// This calls the isContainerReady() method, which in turn calls
// the container to see if Flash Player has loaded and the container
// is ready to receive calls from the SWF.
var containerReady:Boolean = isContainerReady();
if (containerReady)
{
// If the container is ready, register the SWF's functions.
setupCallbacks();
}
else
{
// If the container is not ready, set up a Timer to call the
// container at 100ms intervals. Once the container responds that
// it's ready, the timer will be stopped.
var readyTimer:Timer = new Timer(100);
readyTimer.addEventListener(TimerEvent.TIMER, timerHandler);
readyTimer.start();
}
}
...
}
else
{
trace("External interface is not available for this container.");
}
}
最初に、このコードは
ExternalInterface.available
プロパティを使用して、External API が現在のコンテナで利用可能かどうかをチェックします。利用可能であれば、通信の設定手順が開始されます。 外部アプリケーションと通信しようとするとセキュリティ例外やその他のエラーが発生することがあるため、コードは
try
ブロックでラップされています(簡単にするため、対応する
catch
ブロックは省略されています)。
次に、ここに示すように
isContainerReady()
メソッドが呼び出されます。
private function isContainerReady():Boolean
{
var result:Boolean = ExternalInterface.call("isReady");
return result;
}
isContainerReady()
メソッドは、
ExternalInterface.call()
メソッドを使用して次のように JavaScript 関数
isReady()
を呼び出します。
<script language="JavaScript">
<!--
// ------- Private vars -------
var jsReady = false;
...
// ------- functions called by ActionScript -------
// called to check if the page has initialized and JavaScript is available
function isReady()
{
return jsReady;
}
...
// called by the onload event of the <body> tag
function pageInit()
{
// Record that JavaScript is ready to go.
jsReady = true;
}
...
//-->
</script>
isReady()
関数は、単純に
jsReady
変数の値を返します。この変数の初期値は
false
です。Web ページの
onload
イベントがトリガーされると、変数の値が
true
に変化します。つまり、ページのロード前に ActionScript から
isReady()
関数が呼び出されると、JavaScript から
ExternalInterface.call("isReady")
に
false
が返され、その結果 ActionScript
isContainerReady()
メソッドから
false
が返されます。ページがロードされると、JavaScript
isReady()
関数から
true
が返されるため、ActionScript
isContainerReady()
メソッドからも
true
が返されます。
IMManager コンストラクターでは、コンテナの準備状態に応じて 2 つのことが行われます。
isContainerReady()
から
true
が返された場合は、コードから単純に
setupCallbacks()
メソッドが呼び出されて、JavaScript での通信の設定手順が完了します。一方、
isContainerReady()
から
false
が返された場合、手順は実質的に保留状態になります。Timer オブジェクトが作成され、次のように 100 ミリ秒間隔で
timerHandler()
メソッドを呼び出すよう指示されます。
private function timerHandler(event:TimerEvent):void
{
// Check if the container is now ready.
var isReady:Boolean = isContainerReady();
if (isReady)
{
// If the container has become ready, we don't need to check anymore,
// so stop the timer.
Timer(event.target).stop();
// Set up the ActionScript methods that will be available to be
// called by the container.
setupCallbacks();
}
}
timerHandler()
メソッドが呼び出されるたびに、
isContainerReady()
メソッドの結果が再確認されます。コンテナが初期化されると、このメソッドから
true
が返されます。次に、コードでは Timer を停止して
setupCallbacks()
メソッドを呼び出し、ブラウザーの通信の設定手順を終了します。