Internet Explorer, сокращающий flashVars, содержащий JSON - PullRequest
4 голосов
/ 03 апреля 2012

Это происходит только в IE.

Я использую swfobject и загружаю флэш-файлы как таковые

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);

Все отлично работает во всех браузерах, кроме IE,Я проверил myVar и он приходит в swf как { и все.Я знаю, что он умирает в '.Я попытался поставить \ инфронт, затем попытался \\ и продолжал добавлять одну косую черту, пока я не достиг \\\\\\\\.Я даже перевернул все косые черты и попробовал тот же ритуал.Ничего.

Я могу заставить строку, наконец, пройти, с перевернутыми кавычками и использовать двойные слэши, но потом мой анализатор JSON разозлится из-за слэшей в моей строке.

Вот примериз того, что работает, но из того, что является недействительным JSON:

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

Ответы [ 2 ]

7 голосов
/ 04 апреля 2012

Да, IE обрабатывает flashVars по-разному во всех других основных браузерах, я считаю, что вам нужно использовать метод JavaScript encodeURIComponent , который будет экранировать все зарезервированные символы из вашей строки, например:

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

Если вы передаете несколько значений во flashVars, вы можете перебрать их и закодировать все символы за один проход:

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]);
    }
}

Как предложили @dgmdan и @bcmoney, это, вероятно, сделает вашкод легче читается, если вы используете JSON.stringify - однако вам следует помнить, что IE8 и ниже не не имеют собственного объекта JSON, поэтому вам нужно будет включить JS КрокфордаБиблиотека на вашей HTML-странице.

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

Также стоит помнить, что flashVars ограничены ~ 64k;поэтому, если вы планируете передавать много данных, лучше использовать вызов ExternalInterface, чтобы извлечь их из JavaScript.

0 голосов
/ 03 апреля 2012

Попробуйте заменить первые 3 строки:

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