Bekannte Fehler / Eigenarten: FSCommand und getURL im Flash Player 9 / 10

Artikel: FSCommand und getURL im Flash Player 9 / 10 , Bekannte Fehler / Eigenarten | 21.04.2008

Es gibt eine Eigeneart in Flash Player 9 und höher, welches mehrere FSCommands oder getURL Aufrufe nicht zulässt.
Damit man diese Eigenart aber genauer versteht möchte ich dies anhand ein paar Beispiele genauer erklären.

Einfache Beispiele

Anbei ein paar einfach Beispiel woran diese Eigenart besser erklärt werden kann.

ActionScript 2:
getURL("http://flash.area-network.de", "_blank"); getURL("http://animearchive.de", "_blank");
ActionScript 3:
navigateToURL(new URLRequest("http://flash.area-network.de"), "_blank"); navigateToURL(new URLRequest("http://animearchive.de"), "_blank");
FSCommand:
fscommand("fullscreen", "true"); fscommand("allowscale", "true");

Wer diese Beispiele in Adobe Flash 8 und niedriger wird feststellen, das immer beide Aktionen ausgeführt werden.
Es werden also beide URLs geöffnet oder aber die Flashdatei startet in Vollbildmodus und lässt sich in der Größe ändern.
Werden die Beispiele jedoch in Adobe Flash 9 und höher getestet, so wird nur die letzte Aktion ausgeführt.

Erklärung

Der Flashplayer 9 und höher, lässt keine Aufrufe mit den selben Parametern zu. Hierbei spielt nicht der erste Parameter eine Rolle sonder der 2 Parameter warum auch immer ^^°.
Anbei ein weiteres Beispiel um dies genauer zu erklären.

ActionScript 2:
getURL("http://flash.area-network.de", "_top"); getURL("http://animearchive.de", "_blank");
ActionScript 3:
navigateToURL(new URLRequest("http://flash.area-network.de"), "_top"); navigateToURL(new URLRequest("http://animearchive.de"), "_blank");

Das obere Beispiel öffent wie gewünscht die beiden URLs über Flash, der einzige Unterscheid ist der 2 Parameter.

Beeinflussung von FSCommands

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:
FSCommand("fullscreen", "true");
ActionScript 2:
getURL("FSCommand:fullscreen", "true");
ActionScript 3:
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.
Aus diesem Grund sind FSCommand von diesem Verhalten genauso betroffen wie normale getURL aufrufe.

Lösungen

Es gibt hier nicht sehr viele Lösungen, jedoch eine Übersicht der gängisten Lösungen.

Groß- und Kleinschreibung ändern

Da Adobe Flash seit längeren Case Sensetiv ist, kann man mit Groß- und Kleinschreibung dieses Verhalten umgehen.

ActionScript 3:
fscommand("fullscreen", "true"); fscommand("allowscale", "TRUE");

Dies funktioniert natürlich nur wenn hier auch ein Text als Argument übergeben wird. Auch müssen bei eigene definierte FSCommands darauf geachtet werden, das diese Groß- und Kleinschreibung auch unterstützt wird.

Variable Namen

Eine andere Lösung besteht darin, Variablen anstatt Text für die Argumente zu verwenden, was im normal Fall aber mehr ActionScript Code erzeugt.

ActionScript Code:
var fs1_param = 'true'; var fs2_param = 'true'; fscommand("fullscreen", fs1_param); fscommand("allowscale", fs2_param);

Diese Lösung bringt also den gewünschten Effekt jedoch muss mehr ActionScript geschrieben werden.

Parameter kombinieren

Eine andere Lösung besteht darin entsprechende Parameter zusammen zu fassen, dies kann bei einer Größenänderung sogar vom Vorteil sein.

ActionScript Code:
fscommand("set_size", width, height); anstatt: fscommand("set_width", width); fscommand("set_height", height);

Sollten hier zwei FSCommands verwendet werden und sollte das Object die selbe Höhe wie Breite haben wird einer der beiden FSCommands ignoriert.