info@a-coding-project.de

LiveConnect: Das Zusammenspiel von JavaScript und ActionScript

ActionScript ist wie bereits erwähnt aufgrund seiner Anlehnung an den ECMA-262-Standard JavaScript sehr ähnlich, so dass Macromedias Interesse eine Schnittstelle zu implementieren, welche eine Kommunikation zwischen beiden Scriptsprachen erlaubt, auf der Hand liegt. Diese Kommunikation ist grundsätzlich in beide Richtungen möglichen. So kann man sowohl mit ActionScript Funktionen aus JavaScript aufrufen, als auch mit letzterem einen Flash film durch Zugriff auf allgemeine vordefinierte Methoden von ActionScript steuern.

Kommunikation von ActionScript mit JavaScript

ActionScript sieht für diese Richtung der Kommunikation die Aktion fscommand(Befehl, Argumente), mithilfe derer eine Nachricht an eine Scriptsprache wie etwa JavaScript gesendet werden kann, vor. Dies erklärt die auf den ersten Blick etwas eigenartige Funktionsweise der Aktion, welche also in Bezug auf Scriptsprachen recht vielseitig eingesetzt werden könnte.
Die Aktion fscommand erwartet als Parameter zwei Ausdrücke, welche eine sehr speziell benannte JavaScript - Funktion im HTML-Dokument, in welchem der Flash film eingebettet ist, abfangen und verarbeiten kann. Die Signatur dieser Funktion muss dem Schema NameDes Flash films_DOFSCommand(Befehl, Argumente) entsprechen, damit die in diese Richtung verlaufende Kommunikation zwischen beiden Scriptsprachen funktionieren kann. NameDes Flash films entspricht dabei dem Namen des eingebundenen Flash players, welcher diesem mit dem Attribut name des <object>-Tags bzw. dem Attribut id des <embed>-Tags zugewiesen wurde. Diese Funktion in JavaScript sollte dann die gesendeten FSCommand - Befehle, in einer geeigneten Form auswerten können. So ist es beispielsweise denkbar, dass durch unterschiedliche Befehle jeweils andere Anweisungen ausgeführt werden, wie es zum Beispiel durch ein switch-case-Konstrukt realisierbar wäre. In einem HTML-Dokument, in welchem ein Flash film mit dem Namen myMovie eingebunden ist, könnte daher folgendes JavaScript notiert werden:

<script language="JavaScript">
//JavaScript - Funktion mit spezieller Signatur
function myMovie_DoFSCommand(command, value)
{
  switch(command)
  {
    case "a": alert(value); break;
    case "b": alert(value); break;
    default : alert("Kein entsprechender Befehl!"); break;
  }
}

</script>

Würde im Flash film beispielsweise die Anweisung fscommand("a","Fall a") ausgeführt werden, würde dies durch die JavaScript - Funktion abgefangen und Fall a als Meldung im Browserfenster (alert) ausgegeben werden.
ActionScript stellt des Weiteren die Aktion getURL("URL", [Location [, Variablen]]) zur Verfügung, welche den Browser im ursprünglichen Sinne veranlasst, die mit dem ersten Parameter definierteURLzu laden, wobei der optionale Parameter Location, welcher den Frame definiert, in dem die URL geladen werden soll, im Übrigen folgende Werte erhalten kann:

- _self:URLim gleichen Frame, in dem auch Flash film eingebunden ist, laden
- _blank:URLin neuem Fenster laden
- _parent:URLin übergeordnetem Frame laden
- _top: URLin den obersten Frame laden

Ähnlich, wie man mit einem HTML-Link eine JavaScript -Anweisung auslösen und so etwa eine Funktion aufrufen kann, könnte man dies potentiell auch mit getURL bewirken. Ein Beispiel:

myButton.onRelease = function() 
{
  getURL("javascript:myFunction()","_parent");
}

In diesem Beispiel wird bei Loslassen der Schaltflächeninstanz myButton in demjenigen Frame, welcher dem den Flash film einbindenden Frame übergeordnet ist, die JavaScript - Funktion myFunction aufgerufen werden, so dass auch so ein Zusammenwirken von ActionScript und JavaScript in dieser Richtung erreicht werden könnte. Dies ist natürlich nicht im Sinne des Erfinders und funktioniert auch nicht mit allen Browsern.

Kommunikation von JavaScript mit ActionScript

Andersherum ist es auch möglich, mit JavaScript über die LiveConnect - Schnittstelle einige vordefinierte ActionScript-Methoden des im HTML-Dokument eingebundenen Flash films aufzurufen und damit die Wiedergabe des Flash films zu beeinflussen. Dazu muss JavaScript zunächst auf den Flash film zugreifen können. Marcomedia stellte dazu eine Variante vor, bei der auf den eingebundenen Flash film aufgrund der Tatsache, der dieser in der Objekthierarchie unter dem document-Objekt liegt, also im Allgemeinen mit window.document.Filmname ansprechbar ist, zugegriffen werden kann. Der Aufruf eine der allgemeinen ActionScript-Methoden, wie sie Macromedia auf seiner Homepage zusammenstellt, erfolgt dann mit window.document.Filmname.Methode(). Ein Beispiel:

with(window.document.myMovie)
{
  SetVariable("myString","String");
  GotoFrame(15);
  Play();
}

In diesem Beispiel wird mithilfe der ActionScript - Methode SetVariable("Bezeichner","Wert") der Variablen myString im eingebundenen Flash film mit dem Namen myMovie ein neuer Wert String zugewiesen. Anschließend wird der Flash film angewiesen, zu seinem 15. Bild zu wechseln und anschließend die Wiedergabe zu starten. JavaScript kann also auf diese Weise ActionScript beeinflussen.

Die Integration von LiveConnect

Die Kommunikations - Schnittstelle, wie sie bisher in ihrem Umfang implementiert werden konnte, ist bei weitem nicht auf jeder Plattform vollständig integriert. Das Dilemma, wie es sich im Prinzip schon bei der eher umständlichen und nicht W3C-konformen gängigen Einbettungsmethode von Flash filmen in HTML-Dokumente abzeichnet, setzt sich beim Thema des Browser-Scriptings fort. Die integrativen Verbindungen eben dieses LiveConnects sind so längst nicht bei allen Browsern auf den jeweiligen Plattformen gegeben. So ist beispielsweise bei Opera keine der erwähnten Kommunikationsmöglichkeiten anwendbar, wobei der eigentlich nicht zulässige Aufruf von JavaScript - Funktionen aus ActionScript mit der Aktion getURL bei Opera nur für jene erfolgen kann, welche auch tatsächlich im gleichen Frame wie der eingebundene Flash film notiert sind.
Der Zugriff von JavaScript auf den eingebetteten Flash film ist darüber hinaus - wie man bereits vermuten kann -nicht generell, sondern eher in Ausnahmefällen, über die von Macromedia vorgestellte Form window.document.Filmname möglich, was der Entwickler auch durchaus einräumt. Daher erscheint es notwendig, die Erkennung des Plugins flexibler zu gestalten, wobei sich etwa bei einigen Browsern wie dem Internet Explorer das all-Objekt, bei anderen die Zugriffsmethoden auf ein HTML-Element getElementById(), getElementByName(), getElementsByTagName() des document-Objekts anbieten.

Kommunikation von ActionScript mit serverseitigen Scripts

Ein großes Potential von ActionScript liegt in der Möglichkeit, mit serverseitigen Scriptsprachen wie PHP , CGI oder ASP kommunizieren und mit ihnen Daten austauschen zu können. Durch die Erschließung derartiger Möglichkeiten ist dann auch eine Anbindung an Datenbanken, usw. möglich, was für die Integrativität von Flash von enormer Bedeutung ist.

Variablen dynamisch aus einem serverseitigen Script laden

Die Schnittstelle zu serverseitigen Scripten beschränkt sich im Wesentlichen auf die Möglichkeit, Variablen aus diesen oder anderen externen Quellen, welche zum Beispiel diese generiert haben können, zu laden.
Ein solcher Ladeprozess kann beispielsweise mit der Methode loadVariables("URL" [ ,Variablen]) des Movieclip - Objekts angestoßen werden, wobei die Variablen in die Stufe bzw. Movieclipinstanz, welche die Methode aufruft, geladen, geparst und evtl. vorhandene Variablen überschrieben werden. Die Methode erwartet als ersten Parameter die URL des Scripts, welches die Variablen zurückgibt, oder der externen Datei, in welche die zu ladenden Variablen von einem serverseitigen Script geschrieben wurden. Mit dem zweiten, optionalen Parameter Variablen kann wiederum eine Methode (POST oder GET) festgelegt werden, mit der die Variablen des Flash films an die Datei mit derURLaus erstem Parameter übergeben werden. Diese Datei sollte natürlich in der Lage sein, die via GET oder mit dem HTTP-Header via POST übergebenen Daten auswerten zu können.
Die zu ladenden Variablen müssen in einem bestimmten Format, dem Standard-MIME-Format application/x-www-form-urlencoded, vorliegen, was heißt, dass die Variablen und zugehörigen Werte in der allgemeinen Form Variable=Wert notiert werden und diese Paarungen jeweils durch ein kaufmännisches Und-Zeichen (&) voneinander getrennt werden müssen. Zudem müssen Leerzeichen durch ein Pluszeichen (+) ersetzt werden. Ein Beispiel, bei dem Variablen aus einer Textdatei geladen werden, deren Inhalt zuvor von einem serverseitigen Script geschrieben wurde:

//ActionScript des Flashfilms
_root.myMovieClip.loadVariables("test.txt");
_root.myMovieClip.onData = function() 
{
  _root.myMovieClip.txt1.text = var1 + " und " + var2;
};

//Inhalt einer externen Textdatei
&var1=String1&var2=String2

In diesem Beispiel werden in die Zeitleiste der Movieclipinstanz myMovieClip die Variablen aus der externen Textdatei test.txt geladen, wobei diese im geforderten Format vorliegen. Die erzeugten Variablen im Flash film werden im Anschluss in ein Textfeld namens txt1 der Instanz geschrieben.
Um das Laden direkt durch ein serverseitiges Script zurückgegebener Variablen zu demonstrieren, soll folgendes Beispiel angeführt werden:

//ActionScript des Flashfilms
_root.myMovieClip.loadVariables("test.php");
_root.myMovieClip.onData = function() 
{
  _root.myMovieClip.txt1.text = var1 + " und " + var2;
};

//Script in test.php
<?php
 $var1 = "String1";
 echo '&var1=' . $var1 . '&var2=String2';
?>

Das PHP-Script erzeugt eine Ausgabe in der letzten Anweisung. Dieser String entspricht wiederum dem geforderten MIME - Format, so dass die entsprechenden Variablen auf ähnliche Weise wie im ersten Beispiel in den Flash film geladen und in das Textfeld geschrieben werden können.
Werden in den zu ladenden Variablen Informationen aus Datenbanken gespeichert, ist mittelbar auch die Anbindung von Flash an Datenbank gegeben.
Neben der Methode loadVariables des Movieclip - Objekts existieren auch noch die mittlerweile veralteten Aktionen loadVariables("URL", Stufe/Movieclip [ , Variablen]) und loadVaiablesNum("URL", Stufe [ , Variablen]). Erstere kann Variablen in eine Stufe des Flash players oder eine Movieclipinstanz des Flash films laden, wobei loadVaiablesNum lediglich das Laden von Variablen in eine Stufe beherrscht.
Seit der Flash playerversion 6 ist das dynamische Laden von Variablen auch mithilfe des LoadVars - Objekts möglich, deren Methoden auch Möglichkeiten zum Überwachen des Ladefortschritts (Preloader) bieten. So ließe sich das erste obige Beispiel unter Anwendung des LoadVars-Objekts wie folgt erweitern:

_root.myMovieClip.myLoadVars = new LoadVars();

_root.myMovieClip.myLoadVars.onLoad = function(success)
{
  trace(_root.myMovieClip.myLoadVars.getBytesLoaded() + " von " +
      _root.myMovieClip.myLoadVars.getBytesTotal() + " geladen!");
  if(success)
  {
    _root. myMovieClip.txt1.text = this.var1 + " und " + 
                                   this.var2;        
  }
}

myLoadVars.load("test.txt");

Bei diesem Beispiel werden die Variablen aus test.txt durch die Methode load("URL") des neu erzeugten LoadVars - Objekts myLoadVars im Movieclip myMovieClip geladen, geparst und anschließend als Eigenschaften des Objekts in jenes geschrieben. Schließlich werden nach erfolgreichem Laden der Variablen, welches durch einen booleschen Parameter (hier: success) signalisiert wird, die Eigenschaften des Objekts mit den Bezeichnern der geladenen Variablen in das Textfeld des Movieclips myMovieClip geschrieben. Die Methoden getBytesLoaded() und getBytesTotal() des LoadVars - Objekts geben hier darüber hinaus Aufschluss darüber, wie weit der Ladevorgang bereits fortgeschritten ist.

Weiterlesen: ⯈ Verarbeitung von XML-Dokumenten mit ActionScript

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant