Een van de meest gebruikte toepassingen van de externe API is om ActionScript-toepassingen te laten communiceren met een webbrowser. ActionScript-methoden kunnen met de externe API codes aanroepen die zijn geschreven in JavaScript en omgekeerd. Gezien de complexiteit van browsers en de wijze waarop deze pagina’s intern renderen, kan niet worden gegarandeerd dat een SWF-document zijn callbacks registreert voordat het eerste JavaScript op de HTML-pagina wordt uitgevoerd. Om deze reden moet uw SWF-document, voordat hierin functies vanuit JavaScript worden aangeroepen, altijd eerst de HTML-pagina aanroepen en melden dat het SWF-document gereed is om verbindingen te accepteren.
De Introvert IM bepaalt bijvoorbeeld aan de hand van een reeks stappen die worden uitgevoerd door de klasse IMManager, of de browser gereed is voor communicatie en bereidt het SWF-bestand voor op communicatie. De eerste stap, waarin wordt bepaald of de browser gereed is voor communicatie, vindt als volgt plaats in de constructor 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.");
}
}
Ten eerste controleert de code met behulp van de eigenschap
ExternalInterface.available
of de externe API beschikbaar is in de huidige container. Als dit het geval is, start de code het proces waarbij communicatie wordt ingesteld. Omdat er zich uitzonderingen en andere fouten kunnen voordoen wanneer u communicatie tot stand probeert te brengen met een externe toepassing, is de code opgenomen in een blok
try
(voor een beknopte lijst zijn de overeenkomstige blokken
catch
weggelaten).
De volgende code roept de methode
isContainerReady()
aan:
private function isContainerReady():Boolean
{
var result:Boolean = ExternalInterface.call("isReady");
return result;
}
De methode
isContainerReady()
maakt op zijn beurt gebruik van de methode
ExternalInterface.call()
om de JavaScript-functie
isReady()
als volgt aan te roepen:
<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>
De functie
isReady()
retourneert alleen de waarde van de variabele
jsReady
. Deze variabele is aanvankelijk
false
; nadat de gebeurtenis
onload
van de webpagina geactiveerd is, wordt de waarde van de variabele gewijzigd in
true
. Met andere woorden: als ActionScript de functie
isReady()
aanroept voordat de pagina is geladen, retourneert JavaScript
false
naar
ExternalInterface.call("isReady")
; als gevolg hiervan retourneert de methode ActionScript
isContainerReady()
false
. Nadat de pagina is geladen, retourneert de JavaScript-functie
isReady()
true
, zodat de ActionScript-methode
isContainerReady()
eveneens
true
retourneert.
In de constructor IMManager gebeurt vervolgens één van de volgende twee dingen, afhankelijk van de gereedheid van de container. Als
isContainerReady()
true
retourneert, roept de code alleen de methode
setupCallbacks()
aan, die het proces waarbij communicatie met JavaScript wordt ingesteld, afrondt. Als daarentegen
isContainerReady()
false
retourneert, wordt het proces gepauzeerd. Er wordt een object Timer gemaakt dat de methode
timerHandler()
iedere 100 milliseconden als volgt aanroept:
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();
}
}
Steeds als de methode
timerHandler()
wordt aangeroepen, controleert deze opnieuw het resultaat van de methode
isContainerReady()
. Nadat de container is geïnitialiseerd, retourneert deze methode
true.
De code stopt daarna de Timer en roept de methode
setupCallbacks()
aan om het proces te beëindigen waarbij communicatie met de browser wordt ingesteld.