Harici API'nin en yaygın kullanımlarından biri, ActionScript uygulamalarının bir web tarayıcısıyla iletişim kurmasına olanak sağlamaktır. ActionScript yöntemleri harici API'yi kullanarak JavaScript'te yazılmış bir kod çağırabilir ve aksi durumda tam tersi olur. Tarayıcıların ve dahili olarak sayfa oluşturma şekillerinin karmaşık olması nedeniyle, bir SWF belgesinin HTML sayfasındaki birinci JavaScript çalıştırılmadan önce kendi geri çağrılarını kaydedeceğini garanti etmenin bir yolu yoktur. Bu nedenle, JavaScript'ten SWF belgesindeki işlevler çağrılmadan önce, SWF belgenizin, bağlantıları kabul etmeye hazır olduğunu HTML sayfasına bildirmek için her zaman HTML sayfasını çağırması gerekir.
Örneğin, IMManager sınıfı tarafından gerçekleştirilen adımlar dizisiyle, Introvert IM öğesi tarayıcının iletişim için hazır olup olmadığını belirler ve SWF dosyasını iletişim için hazırlar. Birinci adım (tarayıcının iletişim için ne zaman hazır olduğunu belirleme), şu şekilde IMManager yapıcısında gerçekleşir:
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.");
}
}
İlk olarak, kod
ExternalInterface.available
özelliğini kullanarak geçerli kapta harici API'nin kullanılabilir olup olmadığını kontrol eder. Harici API kullanılabilir durumdaysa, kod, iletişim kurma işlemini başlatır. Harici bir uygulamayla iletişim kurmayı denediğinizde güvenlik istisnaları ve başka hatalar oluşabildiğinden, kod bir
try
bloğunda sarılır. (Kısa olması için, karşılık gelen
catch
blokları çıkarılır.)
Daha sonra kod, burada listelenen
isContainerReady()
yöntemini çağırır:
private function isContainerReady():Boolean
{
var result:Boolean = ExternalInterface.call("isReady");
return result;
}
Bunun sonucunda
isContainerReady()
yöntemi, şu şekilde,
isReady()
JavaScript işlevini çağırmak için
ExternalInterface.call()
yöntemini kullanır:
<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()
işlevi yalnızca
jsReady
değişkeninin değerini döndürür. Bu değişken başlangıçta
false
değerindedir; web sayfasının
onload
olayı tetiklendikten sonra, değişkenin değeri
true
olarak değiştirilir. Başka bir deyişle, sayfa yüklenmeden önce ActionScript
isReady()
işlevini çağırırsa, JavaScript
ExternalInterface.call("isReady")
için
false
değerini döndürür ve sonra da ActionScript
isContainerReady()
yöntemi
false
değerini döndürür. Sayfa yüklendikten sonra, JavaScript
isReady()
işlevi
true
değerini döndürür, böylece ActionScript
isContainerReady()
yöntemi de
true
değerini döndürür.
IMManager yapıcısına geri döndüğümüzde, kabın hazır olma durumuna bağlı olarak iki şeyden biri gerçekleşir.
isContainerReady()
öğesi
true
değerini döndürürse, kod yalnızca
setupCallbacks()
yöntemini çağırır ve bu da JavaScript ile iletişim kurma işlemini tamamlar. Diğer bir yandan,
isContainerReady()
öğesi
false
değerini döndürürse, işlem beklemeye alınır. Aşağıdaki gibi, bir Timer nesnesi oluşturulur ve bu nesneye her 100 milisaniyede bir
timerHandler()
yöntemini çağırması bildirilir:
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()
yöntemi her çağrıldığında, bir kez daha
isContainerReady()
yönteminin sonucunu kontrol eder. Kap başlatıldıktan sonra, bu yöntem
true değerini döndürür.
Daha sonra kod, Timer öğesini durdurur ve tarayıcıyla iletişim kurma işlemini bitirmek için
setupCallbacks()
yöntemini çağırır.