Es gibt mehrere Möglichkeiten Parameter von einer Webseite oder einen Script (PERL, PHP) an eine Flashdatei zu übergeben.
Ich werde auf 2 Möglichkeiten eingehen und zeigen warum die eine Möglichkeit auf keinen Fall verwendet werden sollte.
Inhalt
Parameter übergeben mit FlashVars
Richtiges Codierung der Parameter
Parameter in Adobe Flash abfragen
Diese Möglichkeit ist eine veraltete Möglichkeit auch gibt es hier Einschränkungen, aber ich werde trotzdem auf diese Möglichkeit kurz eingehen.
<object type="application/x-shockwave-flash" data="flashfile.swf?parameter1=wert¶meter2=wert" width="200" height="200" name="flashfile" ID="flashfile">
<param name="movie" value="flashfile.swf?parameter1=wert¶meter2=wert">
<param name="AllowScriptAccess" value="always">
</object>
In diesem Beispiel wird einfach mit Hilfe des ? - Fragezeichens, parameter1 und parameter2 mit den entsprechenden Werten an die Flashdatei flashfile.swf übergeben.
Die Flashdatei kann diese dann relative einfach mit ActionScript auslesen, aber dazu später mehr.
Nachteile dieser Lösung
Generell sollte diese Lösung nicht verwendet werden dies hat mehrere Gründe, zum einem ist der Object TAG nicht dazu geeignet Parameter zu übergeben, zum anderen haben verschiedene Browser Limits bei der Länger der URL.
Das Limit für den Internet Explorer 6 beträgt hier 2083 Zeichen ( http://support.microsoft.com/default.aspx?scid=KB;en-us;q208427), der Firefox hat ein Limit von 4094 Zeichen.
Wenn also flashfile.swf?parameter1=wert¶meter2=wert... länger als 2083 Zeichen ist, wird diese Flashdatei nicht mehr im Internet Explorer dargestellt.
Dies geht schneller als man denkt, da man alle Parameter in escapter Form übergeben muss z.B: http://flash.area-network.de/?test1=3%&test3=öäü sieht in escapter Form so aus http%3A//flash.area-network.de/%3Ftest1%3D3%25%26test3%3D%F6%E4%FC
Diese saubere und bessere Lösung ist die Verwendung von Flashvars, diese werden seit Adobe Flash 6 unterstützt und erlauben Parameter zu übergeben von 64KB (65535 Zeichen).
Somit sollte es eigentlich nie zu Problemen kommen weil zu viele Parameter übergeben werden.
<object type="application/x-shockwave-flash" data="flashfile.swf" width="200" height="200" name="flashfile" ID="flashfile">
<param name="movie" value="flashfile.swf">
<param name="FlashVars" value="parameter1=wert¶meter2=wert">
<param name="AllowScriptAccess" value="always">
</object>
Wie hier zu sehen ist, sind Flash Vars nur ein zusätzlicher Param und der Code sieht auch viel schöner und übersichtlicher aus.
Um eine saubere Übergabe der Parameter zu haben, ist es wichtig das die übergebene Parameter escapted werden.
Bei diesen Vorgang werden einfach alle Sonderzeichen oder reservierte Zeichen so umgewandelt das Sie nicht verwechselt werden können
<object type="application/x-shockwave-flash" data="flashfile.swf" width="200" height="200" name="flashfile" ID="flashfile">
<param name="movie" value="flashfile.swf">
<param name="FlashVars" value="url1=http://animearchive.de?link=home&user=test&url2=http://flash.area-network.de">
<param name="AllowScriptAccess" value="always">
</object>
Parameter werden allgemein mit ? eingeleitet und mehrere Parameter werden mit & getrennt.
Bei diesen Parametern ist das Problem, das es keine genaue Zuordnung gibt, es gibt hier mehre Möglichkeiten wie Flash diese Interpretieren kann:
1. Möglichkeit:
url1 = http://animearchive.de?link=home&user=test
url2 = http://flash.area-network.de
2. Möglichkeit:
link = home
user = test
url2 = http://flash.area-network.de
3. Möglichkeit:
url1 = http://animearchive.de?
link = home
user = test
url2 = http://flash.area-network.de
Wie hier zu sehen ist, ist das in dem Fall schwer für die Flashdatei zu entscheiden was nun richtig ist, aus diesem Grund müssen die Parameter escapted übergeben werden.
<object type="application/x-shockwave-flash" data="flashfile.swf" width="200" height="200" name="flashfile" ID="flashfile">
<param name="movie" value="flashfile.swf">
<param name="FlashVars" value="url1=http%3A//animearchive.de%3Flink%3Dhome%26user%3Dtest&url2=http%3A//flash.area-network.de">
<param name="AllowScriptAccess" value="always">
</object>
Bei diesem Beispiel sind die Parameter klar getrennt weil kein falsch interpretierbares ? oder & enthalten ist.
Aber keine Angst diese wandelt Adobe Flash automatisch wieder richtig um.
Tools zum escapend bzw. für die richtige Codierung
Online Escape Tool: /tools/escaper/
Außerdem bietet Javascript Möglichkeiten an Parameter zu escapen, bitte verwendet aber nicht die Javascript Function escape(), da diese alle Zeichen umwandelt.
Die bessere Funktion ist encodeURIComponent() da hier nur die Zeichen codiert werden, die falsch verstanden werden können.
Natürlich wollen wir die übergebenen Parameter auch mit ActionScript abfragen und evt. verwenden, dies ist eigentlich ganz einfach.
var my_url1= _level0.url1;
var my_url2= _level0.url2;
Die Variablen werden von Adobe Flash 6 bis Adobe Flash 8 also mit _level0.[Parametername] abgefragt. Hier sollte immer _level0. verwendet werden, da _root. nicht immer greift.
Der genaue Unterschied wird in dem Artikel /actionscript/grundlagen/_level0-vs-_root/ genauer erklärt.
In Adobe Flash 9 wurde das _level System abgeschafft, wer also einen Flashdatei in Adobe Flash 9 abspeichert muss die Parameter auf eine andere art und weise auslesen.
Parameter auslesen
var my_url1= root.loaderInfo.parameters.url1;
var my_url2= root.loaderInfo.parameters.url2;
In Adobe Flash 9 werden also die Parameter mit root.loaderInfo.parameters.[Parametername] ausgelesen.
Da sich in Adobe Flash 9 / ActionScript 3 auch bei der Verlinkung viel geändert hat, anbei ein Beispiel wie diese aussehen kann.
Verlinkung
link1.addEventListener(MouseEvent.MOUSE_UP, function(event: MouseEvent): void {
var sURL: String;
if ((sURL = root.loaderInfo.parameters.url1)) {
navigateToURL(new URLRequest(sURL), "_blank");
}
});
Popup Blocker Probleme
Es gibt leider Probleme mit dem eingebauten Popup Blocker in den verschiedenen Browsern. Diese werten teilweise das Fenster, welches über eine Flashdatei geöffnet wird als ein Popup und blocken dieses.
Bis dies behoben wird, wird sicherlich noch einige Zeit vergehen auch gibt es derzeit keinen 100% Workarround hierfür, ein Ansatz ist dies über Javascript zu lösen.
link1.addEventListener(
MouseEvent.MOUSE_UP,
function(event: MouseEvent): void {
var sURL1: String;
if ((sURL1 = root.loaderInfo.parameters.url1)) {
void ExternalInterface.call('open', sURL1, '_blank');
}
}
);
In diesem Beispiel wird der Link als Popup geöffnet und das dies nicht über die Flashdatei passiert, wird in den meisten Fällen der eingebaute Popupblocker nicht angesprochen.
Jedoch sollte klar sein, das zusätzliche Popupblocker dieser Verlinkung sehr wohl blocken.
Bei diesem Beispiel werden 4 Verlinkung an die Flashdatei übergeben welche dann über die 4 Buttons ausgerufen werden können.
<object type="application/x-shockwave-flash" id="flashvars1" data="flashvars_1.swf" width="400" height="400">
<param name="FlashVars" value="clickTAG1=http%3A%2F%2Fanimearchive.de%3Fflashvar_test&clickTAG2=http%3A%2F%2Freifanhp.de%3Fflashvar_test&clickTAG3=http%3A%2F%2Fmarkusbordihn.de%2Fwebseiten%2Fflash-area-network%2Findex.html&clickTAG4=http%3A%2F%2Fwww.adobe.com%2Fgo%2Ftn_16417">
<param name="movie" value="flashvars_1.swf">
</object>
link1.onRelease = function() {
getURL(_level0.clickTAG1, '_blank');
};
link2.onRelease = function() {
getURL(_level0.clickTAG2, '_blank');
};
link3.onRelease = function() {
getURL(_level0.clickTAG3, '_blank');
};
link4.onRelease = function() {
getURL(_level0.clickTAG4, '_blank');
};
