L’API externe est le plus souvent utilisée pour permettre aux applications ActionScript de communiquer avec le navigateur Web. Grâce à elle, les méthodes ActionScript peuvent appeler du code écrit dans JavaScript, et inversement. En raison de la complexité des navigateurs et de leurs processus internes de rendu des pages, il est impossible de garantir qu’un document SWF pourra enregistrer ses rappels avant l’exécution du premier code JavaScript de la page HTML. Par conséquent, avant d’appeler les fonctions du document SWF à partir de JavaScript, le document SWF doit toujours appeler la page HTML pour lui indiquer qu’il est prêt à accepter des connexions.
Par exemple, grâce à une série d’étapes effectuées par la classe IMManager, Introvert IM détermine si le navigateur est prêt à communiquer et prépare le fichier SWF à la communication. La première étape, qui vérifie que le navigateur est prêt à communiquer, a lieu dans le constructeur IMManager, comme suit :
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.");
}
}
Tout d’abord, le code vérifie si l’API externe est disponible dans le conteneur actuel à l’aide de la propriété
ExternalInterface.available
. Si c’est le cas, le processus de mise en place de la communication commence. Pour parer aux éventuelles exceptions de sécurité et autres erreurs qui peuvent se produire pendant les communications avec une application externe, le code est enveloppé dans un bloc
try
(les blocs
catch
correspondants ont été omis de l’exemple pour plus de concision).
Le code appelle ensuite la méthode
isContainerReady()
, présentée ici :
private function isContainerReady():Boolean
{
var result:Boolean = ExternalInterface.call("isReady");
return result;
}
La méthode
isContainerReady()
utilise à son tour la méthode
ExternalInterface.call()
pour appeler la fonction JavaScript
isReady()
, comme suit :
<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>
La fonction
isReady()
renvoie simplement la valeur de la variable
jsReady
. Cette variable a au départ la valeur
false
. Une fois que l’événement
onload
de la page Web est déclenché, la valeur de la variable devient
true
. En d’autres termes, si ActionScript appelle la fonction
isReady()
avant que la page soit chargée, JavaScript renvoie la valeur
false
à
ExternalInterface.call("isReady")
, à la suite de quoi la méthode ActionScript
isContainerReady()
renvoie la valeur
false
. Une fois la page chargée, la fonction JavaScript
isReady()
renvoie la valeur
true
, donc la méthode ActionScript
isContainerReady()
renvoie aussi la valeur
true
.
Dans le constructeur IMManager, deux solutions sont possibles en fonction de la disponibilité du conteneur. Si
isContainerReady()
renvoie la valeur
true
, le code appelle simplement la méthode
setupCallbacks()
, qui achève la mise en place de la communication avec JavaScript. Dans l’autre cas, si
isContainerReady()
renvoie la valeur
false
, le processus est pratiquement mis en attente. Un objet Timer est créé pour appeler la méthode
timerHandler()
toutes les 100 millisecondes, comme suit :
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();
}
}
Chaque fois que la méthode
timerHandler()
est appelée, elle vérifie à nouveau le résultat de la méthode
isContainerReady()
. Lorsque le conteneur est initialisé, la méthode renvoie la valeur
true.
Le code arrête alors le minuteur et appelle la méthode
setupCallbacks()
pour finir la mise en place de la communication avec le navigateur.