2011-03-01 58 views
14

我對Flash 10和ExternalInterface有一個非常奇怪的問題。我目前使用自制的橋樑使用RTMFP使用JavaScript,每當我試圖通過一個包含JSON數據,我得到來自閃存一個奇怪的JavaScript錯誤:爲什麼ExternalInterface會在我使用JSON傳遞參數時中斷?

missing) after argument list 
try { __flash__toXML(Flash.Utilities.A..."")) ; } catch (e) { "<undefined/>"; } 

這是不可能獲得更多的信息,因爲這來了來自Flash並且它不綁定到任何Javascript文件。

要重現這個問題,你可以使用這個腳本:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.external.ExternalInterface; 

    public class Main extends Sprite 
    { 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      var test:String; 

      test = "\"\\\"\""; 

      ExternalInterface.call("console.log", test); 
     } 

    } 

} 

我能做些什麼來避免這個問題,它是一個已知的問題?

+0

您使用'json_encode'? – kjy112 2011-03-01 00:59:38

+0

@ kjy112不,我假設ExternalInterface.call會照顧正確轉義我傳遞給它的數據。 – HoLyVieR 2011-03-01 01:02:02

+0

@holyvier http://maccherone.com/larry/projects/a-pretty-json-encoder-for-actionscript-3-as3/ – kjy112 2011-03-01 01:04:39

回答

22

這顯然是一個已知的問題,似乎Adobe不會很快解決它。

我發現這個問題的detailled explaination和basicly問題似乎是,Flash不處理\&正確地從閃存轉移到JavaScript的,在此期間可能會導致JavaScript錯誤或數據損壞。

什麼閃光時,嘗試從閃存傳輸數據到JS做的是執行以下的事情:

try { 
    __flash__toXML(yourJavascriptFunction("[DATA]")) ; 
} catch (e) { "<undefined/>"; } 

的問題是,它使您的數據生不轉義反斜線在所有。如果字符串只包含\和你要調用console.log就可以了,它會嘗試做以下事情:

try { 
    __flash__toXML(console.log("\")) ; 
} catch (e) { "<undefined/>"; } 

正如你可以看到這是無效的JavaScript。它會在你的Javascript控制檯中拋出一個錯誤,它永遠不會調用console.log

解決方案是鴨嘴形閃光行爲或做一些討厭的黑客來解決它。

爲了避免閃存Buggy,您可以在轉移它們之前將黑色字符轉義出來。這個解決方案現在可以工作,但是當Flash將修復它(很可能不會在不久的將來,如果你認爲這個bug已知4年以上),它將會破壞你的應用程序。

另一種可能性是對Flash處理不好的字符進行url編碼(\,",&),並在另一端解碼它們。

閃光燈:

data = data.split("%").join("%25") 
      .split("\\").join("%5c") 
      .split("\"").join("%22") 
      .split("&").join("%26"); 

的Javascript:

data = data.replace(/%22/g, "\"") 
      .replace(/%5c/g, "\\") 
      .replace(/%26/g, "&") 
      .replace(/%25/g, "%"); 

它的醜陋,但它的工作原理。

+0

「醜陋的」黑客行不通,但下面的逃跑沒有。儘管如此,這個解釋仍然足以讓事情變得積極。 – Wernight 2013-12-30 16:03:54

6

無可否認,這將無法正常工作直接輸出到Firebug中的控制檯,但對於大多數其他應用程序(即,發送一個潛在的 '無效' 的字符串爲Javascript),escapeunescape應該只是罰款:

AS3:

var testString:String = "\"\\\"\""; 
ExternalInterface.call("showString", escape(testString)); 

然後在的Javascript:

function showString(msg) { 
    console.log(unescape(msg)); 
    document.getElementById('messagebox').innerHTML = unescape(msg); 
} 

<div id="messagebox"></div>