외부 API는 주로 ActionScript 응용 프로그램이 웹 브라우저와 통신할 수 있도록 허용하는 데 사용됩니다. 외부 API를 사용하면 ActionScript 메서드가 JavaScript에서 작성한 코드를 호출할 수 있으며 그 반대도 마찬가지입니다. 브라우저의 복잡성과 내부에서 페이지를 렌더링하는 방법으로 인해 HTML 페이지의 첫 번째 JavaScript를 실행하기 전에 SWF 문서에서 콜백을 등록하도록 보장할 수 있는 방법은 없습니다. 이러한 이유로 JavaScript에서 SWF 문서의 함수를 호출하기 전에 항상 SWF 문서에서 HTML 페이지를 호출하여 SWF 문서가 연결을 허용할 수 있는 상태임을 알려야 합니다.
예를 들어 IMManager 클래스에서 수행한 몇 가지 단계를 통해 Introvert IM에서 브라우저가 통신할 수 있는 상태인지 확인하고 통신을 위해 SWF 파일을 준비합니다. 브라우저가 통신 가능한 상태인지 확인하는 첫 번째 단계는 다음과 같이 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
속성을 사용하여 현재 컨테이너에서도 외부 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
이며, 웹 페이지의
onload
이벤트가 트리거되면 변수 값이
true
로 바뀝니다. 즉, 페이지가 로드되기 전에 ActionScript가
isReady()
함수를 호출하면 JavaScript가
ExternalInterface.call("isReady")
에
false
를 반환하고, 그 결과 ActionScript
isContainerReady()
메서드가
false
를 반환합니다. 페이지가 로드되면 JavaScript
isReady()
함수가
true
를 반환하므로 ActionScript
isContainerReady()
메서드도
true
를 반환합니다.
IMManager 생성자로 돌아가면 컨테이너의 준비 상태에 따라 두 가지 중 하나가 발생합니다.
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()
메서드를 호출하여 브라우저와의 통신 설정 프로세스를 마칩니다.