Komunikacja między kodem ActionScript a aplikacją kontenera może mieć jedną z dwóch form: kod ActionScript może wywoływać kod (np. funkcję JavaScript) zdefiniowany w kontenerze lub kod w kontenerze może wywoływać funkcję ActionScript, która może zostać wywołana. W każdym z tych przypadków informacje mogą być wysyłane do wywoływanego kodu, a wartości zwracane mogą być zwracane do kodu wywołującego.
W celu ułatwienia komunikacji klasa ExternalInterface zawiera dwie statyczne właściwości i dwie statyczne metody. Te właściwości i metody służą do uzyskiwania informacji o połączeniach interfejsu zewnętrznego w celu wykonania kodu w kontenerze z języka ActionScript oraz w celu udostępnienia funkcji ActionScript do wywołania przez kontener.
Pobieranie informacji o kontenerze zewnętrznym
Właściwość
ExternalInterface.available
określa, czy bieżąca instancja programu Flash Player jest kontenerem, który oferuje interfejs zewnętrzny. Jeśli interfejs zewnętrzny jest dostępny, ta właściwość ma wartość
true
; w przeciwnym razie ma wartość
false
. Przed wykorzystaniem innych możliwości klasy ExternalInterface należy upewnić się, że bieżący kontener obsługuje komunikację z interfejsem zewnętrznym:
if (ExternalInterface.available)
{
// Perform ExternalInterface method calls here.
}
Uwaga:
Właściwość
ExternalInterface.available
określa, czy bieżący kontener obsługuje połączenie z klasą ExternalInterface. Jednak ta właściwość nie określa, czy obsługa języka JavaScript została włączona w bieżącej przeglądarce.
Właściwość
ExternalInterface.objectID
umożliwia określenie unikalnego identyfikatora instancji Flash Player (atrybut
id
znacznika
object
w programie Internet Explorer lub atrybut
name
znacznika
embed
w przeglądarkach korzystających z interfejsu NPRuntime). Ten unikalny identyfikator reprezentuje bieżący dokument SWF w przeglądarce i może służyć do utworzenia odwołania do dokumentu SWF — na przykład w przypadku wywołania funkcji JavaScript na stronie HTML kontenera. Jeśli kontener Flash Player nie jest przeglądarką sieci Web, ta właściwość ma wartość
null
.
Wywoływanie kodu zewnętrznego z kodu ActionScript
Metoda
ExternalInterface.call()
wykonuje kod w aplikacji kontenera. Wymaga wywołania co najmniej jednego parametru — ciągu znaków zawierającego nazwę funkcji, która ma zostać wywołana w aplikacji kontenera. Wszystkie pozostałe parametry wprowadzane do metody
ExternalInterface.call()
są wprowadzane wraz z kontenerem jako parametry wywołania funkcji.
// calls the external function "addNumbers"
// passing two parameters, and assigning that function's result
// to the variable "result"
var param1:uint = 3;
var param2:uint = 7;
var result:uint = ExternalInterface.call("addNumbers", param1, param2);
Jeśli kontener jest stroną HTML, ta metoda wywołuje funkcję JavaScript z określoną nazwą, którą należy zdefiniować w elemencie
script
w zawierającej stronie HTML. Wartość zwracana funkcji JavaScript function jest przekazywana z powrotem do kodu ActionScript.
<script language="JavaScript">
// adds two numbers, and sends the result back to ActionScript
function addNumbers(num1, num2)
{
return (num1 + num2);
}
</script>
Jeśli kontener jest innym kontenerem ActiveX, ta metoda sprawia, że formant Flash Player ActiveX wywołuje własne zdarzenie
FlashCall
. Określona nazwa funkcji i parametry są serializowane w ciąg XML przez program Flash Player. Kontener może uzyskać dostęp do tych informacji we właściwości
request
obiektu zdarzenia, a następnie wykorzystać je w celu określenia sposobu wykonania własnego kodu. W celu zwrócenia wartości do kodu ActionScript kod kontenera wywołuje metodę
SetReturnValue()
obiektu ActiveX, przekazując wynik (serializowany do ciągu XML) jako parametr metody. Więcej informacji o formacie XML używanym dla komunikacji zawiera sekcja
Format XML zewnętrznego interfejsu API
.
Niezależnie od tego, czy kontener jest przeglądarką sieci Web lub innym kontenerem ActiveX — jeśli wywołanie nie powiedzie się lub jeśli metoda kontenera nie określa wartości zwracanej, zwracana jest wartość
null
. Metoda
ExternalInterface.call()
zgłasza wyjątek SecurityError, jeśli środowisko zawierające należy do bezpiecznego obszaru izolowanego, do którego kod wywołujący nie ma dostępu. Aby obejść to ograniczenie, należy ustawić odpowiednią wartość dla
allowScriptAccess
w środowisku zawierającym. Na przykład: aby zmienić wartość
allowScriptAccess
na stronie HTML, należy zmodyfikować odpowiedni atrybut w znacznikach
object
i
embed
.
Wywołanie kodu ActionScript z kontenera
Kontener może wywołać tylko kod ActionScript, który znajduje się w funkcji — żaden inny kod ActionScript nie może być wywoływany przez kontener. W celu wywołania funkcji ActionScript z aplikacji kontenera należy wykonać dwie czynności: zarejestrować funkcję w klasie ExternalInterface, a następnie wywołać ją z kodu kontenera.
Najpierw należy zarejestrować funkcję ActionScript w celu wskazania, że powinna zostać udostępniona dla kontenera. Należy użyć metody
ExternalInterface.addCallback()
w następujący sposób:
function callMe(name:String):String
{
return "busy signal";
}
ExternalInterface.addCallback("myFunction", callMe);
Metoda
addCallback()
przyjmuje dwa parametry. Pierwszy, nazwa funkcji (w tym przypadku String), to nazwa, pod jaką funkcja będzie znana kontenerowi. Drugi parametr jest rzeczywistą funkcją ActionScript, która zostanie wykonana, gdy kontener wywoła zdefiniowaną nazwę funkcji. Nazwy są rozróżniane, dlatego możliwe jest określenie nazwy funkcji, która zostanie wykorzystana przez kontener, nawet jeśli rzeczywista funkcja ActionScript ma inną nazwę. Jest to szczególnie użyteczne wówczas, gdy nazwa funkcji nie jest znana — np. w przypadku określenia funkcji anonimowej lub gdy funkcja, która zostanie wywołana, jest wybierana w czasie wykonywania.
Gdy funkcja ActionScript zostanie zarejestrowana w klasie ExternalInterface, kontener może wywołać tę funkcję. Sposób, w jaki to się odbywa, jest uzależniony od typu kontenera. Na przykład: w kodzie JavaScript, w przeglądarce sieci Web, funkcja ActionScript jest wywoływana przy użyciu zarejestrowanej nazwy funkcji, tak jakby była to metoda obiektu przeglądarki programu Flash Player (tj. metoda obiektu JavaScript reprezentującego znacznik
object
lub
embed
). Innymi słowy: parametry są przekazywane, a wynik jest zwracany w taki sposób, jakby wywoływana była funkcja lokalna.
<script language="JavaScript">
// callResult gets the value "busy signal"
var callResult = flashObject.myFunction("my name");
</script>
...
<object id="flashObject"...>
...
<embed name="flashObject".../>
</object>
I odwrotnie — w przypadku wywołania funkcji ActionScript w pliku SWF działającym w aplikacji pulpitu nazwę zarejestrowanej funkcji i wszystkie parametry należy serializować, tworząc ciąg znaków w formacie XML. Następnie w celu wywołania funkcji należy wywołać metodę
CallFunction()
formantu ActiveX, wykorzystując ciąg znaków XML jako parametr. Więcej informacji o formacie XML używanym do komunikacji zawiera sekcja
Format XML zewnętrznego interfejsu API
.
W każdym z tych przypadków wartość zwracana funkcji ActionScript jest przekazywana z powrotem do kodu kontenera — bezpośrednio jako wartość, gdy obiektem wywołującym jest kod JavaScript w przeglądarce lub w postaci serializowanej jako ciąg znaków w formacie XML, jeśli obiektem wywołującym jest formant ActiveX.
Format XML zewnętrznego interfejsu API
W komunikacji między językiem ActionScript oraz aplikacją obsługującą formant Shockwave Flash ActiveX wykorzystywany jest konkretny format w celu kodowania wywołań i wartości funkcji. Zewnętrzny interfejs API korzysta dwuczęściowego formatu XML. Jeden format jest używany do reprezentowania wywołań funkcji. Drugi format służy do reprezentowania poszczególnych wartości; ten format jest używany dla parametrów w funkcjach, a także jako wartości zwracane funkcji. Format XML dla wywołań funkcji jest używany dla wywołań do i z kodu ActionScript. W przypadku wywołania funkcji z ActionScript program Flash Player przekazuje ciąg znaków XML do kontenera; w przypadku wywołania z kontenera program Flash Player oczekuje, że aplikacja kontenera przekaże do niego ciąg znaków XML w tym formacie. Poniższy fragment XML przedstawia przykładowe wywołanie funkcji w formacie XML:
<invoke name="functionName" returntype="xml">
<arguments>
... (individual argument values)
</arguments>
</invoke>
Węzłem głównym jest węzeł
invoke
. Zawiera dwa atrybuty:
name
wskazuje nazwę funkcji do wywołania, a
returntype
ma zawsze wartość
xml
. Jeśli wywołanie funkcji zawiera parametry, wówczas węzeł
invoke
zawiera podrzędny węzeł
arguments
, którego węzły podrzędne będą wartościami parametrów sformatowanymi za pomocą formatu osobnych wartości, który opisano poniżej.
Osobne wartości, między innymi parametry funkcji i wartości zwracane funkcji, korzystają ze schematu formatowania, który zawiera informacje o typie danych, a także rzeczywiste wartości. W poniższej tabeli przedstawiono klasy ActionScript oraz format XML używany do kodowania wartości typów danych:
Klasa/wartość ActionScript
|
Klasa/wartość C#
|
Format
|
Komentarze
|
null
|
null
|
<null/>
|
|
logiczne
true
|
logiczne true
|
<true/>
|
|
logiczne
false
|
logiczne false
|
<false/>
|
|
Ciąg
|
string
|
<string>wartość ciągu znaków</string>
|
|
Number, int, uint
|
single, double, int, uint
|
<number>27.5</number>
<number>-12</number>
|
|
Tablica (elementy różnych typów)
|
Kolekcja, która może zawierać elementy różnych typów, np. ArrayList lub object[]
|
<array>
<property id="0">
<number>27.5</number>
</property>
<property id="1">
<string>Hello there!</string>
</property>
...
</array>
|
Węzeł
property
definiuje poszczególne elementy, a atrybut
id
jest indeksem liczbowym.
|
Object
|
Słownik z kluczami ciągów znaków i wartościami obiektów, np. HashTable z kluczami ciągów znaków
|
<object>
<property id="name">
<string>John Doe</string>
</property>
<property id="age">
<string>33</string>
</property>
...
</object>
|
Węzeł
property
definiuje poszczególne właściwości, a atrybut
id
jest nazwą właściwości (ciągiem znaków).
|
Inne wbudowane lub niestandardowe klasy
|
|
<null/> or
<object></object>
|
ActionScript koduje inne obiekty jako null lub jako puste obiekty. W każdym z tych przypadków dochodzi do utraty wartości właściwości.
|
Uwaga:
Tabela przestawia również równoważne klasy C#, a także klasy ActionScript; zewnętrzny interfejs API może być używany do komunikacji z dowolnym językiem programowania lub środowiskiem wykonawczym, które obsługuje formanty ActiveX i nie jest ograniczony do aplikacji C#.
Podczas tworzenia własnych aplikacji za pomocą zewnętrznego interfejsu API w aplikacji kontenera ActiveX pewnym udogodnieniem może być napisanie proxy, które wykona zadanie przekształcenia rodzimych wywołań funkcji na serializowany format XML. Przykład klasy proxy napisanej w języku C# zawiera sekcja W klasie ExternalInterfaceProxy.
|
|
|