FSCommand ermöglichen die Kommunikation zwischen der SWF-Datei und dem Flash Player bzw. dem Programm, in dem der Flash Player ausgeführt wird (z.B. Webbrowser).
Mit Hilfe von FSCommand können Nachrichten an bestimmte Programme verschickt werden, wie das geht und welcher Sinn dahinter steht wird hier genauer erklärt.
Inhalt
In bestimmten Situationen ist es nötig, das der Flashplayer/Flashdatei der Webseite oder aber einem JavaScript mitteilt was dieser gerade macht.
Das einfachste Beispiel ist wenn die Flashdatei als Layer (position: absolute;) angezeigt wird und dieser evt. geschlossen werden soll.
Ein anderes Beispiel wäre wenn die Flashdatei als Expandable angezeigt wird und diese sich vergrößern soll oder aber ausrollen soll, sobald der User sich mit der Maus über der Flashdatei befindet.
Es gibt noch eine Menge mehr Beispiele die nichts direkt mit der Anzeige zu tuen haben, so können FSCommand auch dazu verwendet werden die Webseite zu steuern mit Hilfe von JavaScript.
Eine andere auch interessante Verwendung ist die Bedeutung von FSCommands in einer so genannten Projektor Datei (.exe), hier lässt sich die Flashdatei sehr einfach schließen oder im Vollbildmodus starten.
Es gibt natürlich die Möglichkeit mit Hilfe von getURL JavaScript auszuführen indem als URL einfach JavaScript:function(); übergeben wird.
Jedoch haben FSCommands eine Reihe von Vorteilen, so das man für eine Kommunikation mit der Webseite diese verwenden sollte.
Vorteile:
- Kein hörebares Klicken beim ausführen
Im Gegensatz zu getURL wo der User ein Klickgeräusch hört als würde er auf einen Link klicken. - Schnelle Verarbeitung
FSCommands können sehr schnell verarbeitet werden. Wenn es nötig ist, in Sekunden oder Milisekundenbereich Daten auszutauschen so ist dies nur mit FScommands sinnvoll möglich. - Einfache Schnittstelle
FSCommands sind relativ einfach zu implementieren und können für jede Flashdatei einzeln definiert werden. - Erzeugt keinen JavaScript Fehler
Falls ein FSCommand nicht definiert ist und aufgerufen wird, erzeugt dieses keinen JavaScript Fehler oder eine sonstige Fehlermeldung, wie dies bei der Lösung über getURL der Fall wäre. - Einfaches Prüfen / Debugging
Es ist ohne viel Aufwand möglich sich die FSCommands anzeigen zu lassen die gerade ausgelöst werden, mit einem so genannten Catch All.
Wenn der Flashplayer als Projector Datei ausgeführt, wenn die Flashdatei als .exe oder aber .hqx gespeichert wird, können spezielle FSCommands für die Steuerung verwenden werden.
Diese FSCommands haben im Flashplayer im Browser keine Wirkung und werden dort ignoriert, jedoch sollte darauf geachtet werden diese nicht im normalen Browser Flashplayer zu verwenden.
| FSCommand | Wert | Beschreibung | |
|---|---|---|---|
quit | true / false | Beendet den Projektor | |
fullscreen | true / false | Bei true wird der Projektor im Vollbildmodus angezeigt. Bei der Angabe false wird der Player auf die normale Größe geändert. |
|
allowscale | true / false | Bei true wird die Flashdatei auf die Flashplayergröße skaliert dargestellt. Bei der Angabe false wird diese nur in der ursprünglichen Größe dargestellt. |
|
showmenu | true / false | Bei true sind alle Menü Elemente sichtbar. Bei false sind nur die Menüpunkt Einstellungen und Über Flash Player sichtbar. | |
exec | Programm ink. Path | Führt eine Anwendung aus, hierzu muss der komplette Path zu dieser Anwendung verwendet werden. | |
trapallkeys | true / false | Bei true werden alle Tastenereignisse und Tastenkombinationen, an die Prozedur onClipEvent (keyDown/keyUp) übergeben. |
|
Wie schon erwähnt werden FSCommand meist dazu verwendet, damit eine Flashdatei mit einer Webseite interagieren kann.
Da leider nicht alle Browser ohne ein entsprechendes JavaScript auf der Webseite FSCommands unterstützen, gehe ich hier auch auf den Einbau in der Webseite genauer ein.
Um FSCommands in allen Browsern verwenden zu können ist es also nötig ein JavaScript auf der Webseite zu hinterlegen und die entsprechenden FSCommands in die Flashdatei einzubauen.
Auch gibt es seit Flashplayer 8 ein paar Sicherheitsänderungen, auf welche ich aber auch im Detail eingehen werde.
Live Beispiel
JavaScript:
Diese Textbox mit "JavaScript:" davor ist eine reine HTML Textbox, normalerweise kann hier Adobe Flash nicht darauf zugreifen.
Mit Hilfe von FSCommand ist dies jedoch sehr einfach möglich wie das Beispiel zeigt.
ActionScript und HTML / Javascript für FSCommands
Anbei der Quellcode für die Flashdatei und für die HTML Datei für dieses Beispiel, falls jemand noch nie mit JavaScript oder HTML gearbeitet hat, wird das Beispiel nicht sehr viel weiterhelfen.
Hier sollten zuerst HTML und JavaScript Grundlagen erlernt werden wie z.B. unter http://de.selfhtml.org/.
ActionScript für FSCommands
testarea.onRollOver = function() {
fscommand('onRollOver');
trace('onRollOver');
};
testarea.onRollOut = function() {
fscommand('onRollOut');
trace('onRollOut');
};
testarea.onRelease = function() {
fscommand('onClick');
trace('onClick');
};
In diesem Beispiel existiert in der Flashdatei ein MovieClip mit dem Instanznamen testarea diesem werden Events zugewiesen über onRollOver = ... onRollOut = ... onRelease = ... .
Der trace Befehl dient dazu das man dies im Flasheditor nachvollziehen / nachprüfen kann, da FSCommand nicht vom Flash Editor angezeigt werden.
Hier wird also wenn die Maus über den MovieClip bewegt wird der Befehl "onRollOver" gesendet, sobald die Maus wieder raus bewegt wird, sendet die Flashdatai "onRollOut".
Sollte der User auf den MovieClip klicken, so wird der Befehl "onClick" gesendet.
FSCommand Unterstützung für den Browser
Wie vorher erwähnt unterstützten nur Mozila Browser wie z.B. der Firefox FSCommand ohne ein zusätzliches JavaScript, der Internet Explorer und andere Browser benötigen einen so genannten FSCommand Event Handler.
Dieser dient als Schnittstelle und nimmt dem entsprechend die FScommand an und leitet diese an die entsprechende JavaScript Funktion weiter.
<object type="application/x-shockwave-flash" data="fscommand_01.swf" width="200" height="200" name="fscommand_1" ID="fscommand_1">
<param name="movie" value="fscommand_01.swf">
<param name="AllowScriptAccess" value="always">
</object>
<p>JavaScript: <input id="demo_1" type="text" value=""></p>
<script language="JavaScript">
var isInternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
function fscommand_1_DoFSCommand(command, args) {
var fscommand_1Obj = isInternetExplorer ? document.all.fscommand_1 : document.fscommand_1;
...
document.getElementById('demo_1').value = command;
...
}
if (isInternetExplorer) {
document.getElementById('fscommand_1').attachEvent("FSCommand", fscommand_1_DoFSCommand);
}
</script>
Ein paar Erklärungen zu den einzelnen Zeilen:
- ID="fscommand_1" legt die ID fest über welche die Flashdatei angesprochen werden kann. Eine ID darf nur einmal in der aktuellen Webseite vorkommen.
- <param name="AllowScriptAccess" value="always"> erlaubt das die Flashdatei auf die Webseite zugreifen darf oder aber die Webseite auf die Flashdatei.
- navigator.appName.indexOf("Microsoft") != -1 prüft ob der Browser der Internet Explorer ist, wenn ja ist der Wert 1.
- function fscommand_1_DoFSCommand(command, args) dies ist die Funktion die über FScommands angesprochen wird. In diesem Beispiel nehmen wir einfach den FScommand der übergeben wird und zeigen diesen in dem Textfeld an.
- attachEvent("FSCommand", fscommand_1_DoFSCommand); dies fügt den FSCommand Eventlistener für den Internet Explorer hinzu.
FSCommands werden nicht wie die meisten denken als FSCommands abgespeichert, sondern als getURL Aufruf.
Der ByteCode von FSCommands und GetURL Aufrufen sieht also gleich aus, anbei 3 Beispiele die alle das selbe bewirken.
FSCommand("fullscreen", "true");
getURL("FSCommand:fullscreen", "true");
navigateToURL(new URLRequest("fscommand:fullscreen"), "true");
Die Screibweise fscommand(...) ist also nur eine Abkürzung, die beim kompilieren in eine SWF Datei in einem getURL Aufruf umgewandelt wird.
