2012-04-03 2 views
4

Dies geschieht nur in IE.Internet Explorer abgeschnitten FlashVars mit JSON

Ich verwende swfobject und das Flash-Laden vars als solche

var flashVars = { 
     myVar:'{"url":"http://google.com/", "id":"9999"}', 
}; 
var params = { 
    allowFullScreen:"true", 
    wmode:"transparent", 
    allowScriptAccess:'always' 
    }; 
swfobject.embedSWF("mySwf.swf", "mySwf", "512", "318", "10.0.0", "./js/swfobject/expressInstall.swf", flashVars, params); 

Alles perfekt in jedem Browser aber IE funktioniert. Ich überprüfte und es kommt in die swf als { und das ist es. Ich weiß, dass es bei ' stirbt. Ich habe versucht, eine \ infront, dann versuchte \\ und fügte einen Schrägstrich bis ich zu \\\\\\\\. Ich habe sogar alle Schnitte invertiert und dasselbe Ritual versucht. Nichts.

Ich kann die Zeichenfolge endlich durchkommen, mit invertierten Anführungszeichen und doppelten Schrägstrichen, aber dann wird mein JSON-Parser wütend, weil es in meiner Zeichenfolge Schrägstriche gibt.

Hier ist ein Beispiel dafür, was funktioniert, aber von dem, was ungültige JSON ist:

"{\\'url\\':\\'http://google.com/\\', \\'id\\':\\'9999\\'}" 

Antwort

7

Yep IE behandelt flashVars anders zu allen anderen Haupt - Browser, ich glaube, Sie müssen die JavaScript encodeURIComponent Methode verwenden, die alle reservierten Zeichen aus Ihrem String, z. B .:

// Removing all reserved characters from the flashVar value. 
var flashVars = { 
    myVar: encodeURIComponent('{"url":"http://google.com/", "id":"9999"}'), 
}; 

Wenn Sie mehrere Werte in den flashVars sind vorbei, dann können Sie durch sie durchlaufen und alle Zeichen in einem einzigen Durchgang kodieren:

var flashVars = { 
    myVar: '{"url":"http://google.com/", "id":"9999"}', 
    anotherVar: 42 
}; 

// Escape all values contained in the flashVars object. 
for (key in flashVars) { 
    if (flashVars.hasOwnProperty(key)) { 
     flashVars[key] = encodeURIComponent(flashVars[key]); 
    } 
} 

Als @dgmdan und @bcmoney vorschlug, wäre es wahrscheinlich Ihren Code einfacher machen, lesen Sie, wenn Sie JSON.stringify verwendet haben - jedoch müssen Sie berücksichtigen, dass IE8 und unter nicht ein natives JSON-Objekt haben, so müssen Sie Crockford's JS Library in Ihre HTML-Seite enthalten.

// Making use of a JSON library. 
var flashVars = { 
    myVar: encodeURIComponent(JSON.stringify({ url: "http://google.com/", id: "9999"})), 
}; 

Es ist auch zu beachten, dass flashVars auf ~ 64k begrenzt sind; Wenn Sie also viele Daten übergeben möchten, ist es möglicherweise besser, einen ExternalInterface Aufruf zu verwenden, um sie stattdessen aus dem JavaScript zu ziehen.

+0

Ich wechselte auf externe Schnittstelle und alles funktioniert jetzt gut. Es ist jedoch nicht wegen der 64K-Grenze. Ich muss die 1encodeURIComponent1 ausprobieren, um so wie das geht. Danke für die Pro-Antwort! – Jacksonkr

+0

Laut [caniuse] (http://caniuse.com/json) ist natives JSON für IE8 verfügbar – paleozogt

0

diesen Versuchen Sie, Ihre ersten 3 Zeilen zu ersetzen:

var subVars = { url: "http://google.com/", id: "9999" }; 
var flashVars = { myVar: JSON.stringify(subVars) };