Javascript 当我用类似JSON的字符串传递参数时,ExternalInterface为什么会中断?

Javascript 当我用类似JSON的字符串传递参数时,ExternalInterface为什么会中断?,javascript,flash,actionscript-3,externalinterface,Javascript,Flash,Actionscript 3,Externalinterface,我对Flash 10和外部接口有一个非常奇怪的问题。我目前正在使用一个自制的桥接器将RTMFP与Javascript一起使用,每当我尝试传递包含JSON的数据时,我都会收到一个来自Flash的wierd Javascript错误: missing ) after argument list try { __flash__toXML(Flash.Utilities.A..."")) ; } catch (e) { "<undefined/>"; } 我能做些什么来避免这个问题?这是一

我对Flash 10和外部接口有一个非常奇怪的问题。我目前正在使用一个自制的桥接器将RTMFP与Javascript一起使用,每当我尝试传递包含JSON的数据时,我都会收到一个来自Flash的wierd Javascript错误:

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

我能做些什么来避免这个问题?这是一个已知的问题吗?

这显然是一个已知的问题,Adobe似乎不会很快解决它

我发现了这个问题的一个原因,基本上问题似乎是Flash没有正确处理
\
&
,这可能导致从Flash到javascript的传输过程中出现javascript错误或数据损坏

当您将数据从Flash传输到JS时,Flash尝试执行以下操作:

try {
    __flash__toXML(yourJavascriptFunction("[DATA]")) ;
} catch (e) { "<undefined/>"; }
try {
    __flash__toXML(console.log("\")) ;
} catch (e) { "<undefined/>"; }
正如您所看到的,这是无效的javascript。它将在Javascript控制台中抛出一个错误,并且永远不会调用
console.log

解决方案是要么回避磁带闪存行为,要么做一些讨厌的黑客来绕过它

要避免磁带闪存错误,您可以在转移它们之前逃离黑色斜杠。这个解决方案现在会起作用,但是当Flash将修复它(很可能不是在不久的将来,如果你认为这个bug被知道超过4年),它将破坏你的应用程序。 另一种可能是对Flash处理不好的字符进行url编码(
\
&
),并在另一端对其进行解码

闪光:

data = data.split("%").join("%25")
           .split("\\").join("%5c")
           .split("\"").join("%22")
           .split("&").join("%26");
data = data.replace(/%22/g, "\"")
           .replace(/%5c/g, "\\")
           .replace(/%26/g, "&")
           .replace(/%25/g, "%");
var testString:String = "\"\\\"\"";
ExternalInterface.call("showString", escape(testString));
function showString(msg) {
    console.log(unescape(msg));
    document.getElementById('messagebox').innerHTML = unescape(msg);
}

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

data = data.split("%").join("%25")
           .split("\\").join("%5c")
           .split("\"").join("%22")
           .split("&").join("%26");
data = data.replace(/%22/g, "\"")
           .replace(/%5c/g, "\\")
           .replace(/%26/g, "&")
           .replace(/%25/g, "%");
var testString:String = "\"\\\"\"";
ExternalInterface.call("showString", escape(testString));
function showString(msg) {
    console.log(unescape(msg));
    document.getElementById('messagebox').innerHTML = unescape(msg);
}

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

它很难看,但很管用。

无可否认,这对Firebug中控制台的输出不起作用,但对于大多数其他应用程序(即,向Javascript发送一个潜在的“无效”字符串),
escape
unescape
应该可以正常工作:

AS3:

data = data.split("%").join("%25")
           .split("\\").join("%5c")
           .split("\"").join("%22")
           .split("&").join("%26");
data = data.replace(/%22/g, "\"")
           .replace(/%5c/g, "\\")
           .replace(/%26/g, "&")
           .replace(/%25/g, "%");
var testString:String = "\"\\\"\"";
ExternalInterface.call("showString", escape(testString));
function showString(msg) {
    console.log(unescape(msg));
    document.getElementById('messagebox').innerHTML = unescape(msg);
}

<div id="messagebox"></div>
然后在Javascript中:

data = data.split("%").join("%25")
           .split("\\").join("%5c")
           .split("\"").join("%22")
           .split("&").join("%26");
data = data.replace(/%22/g, "\"")
           .replace(/%5c/g, "\\")
           .replace(/%26/g, "&")
           .replace(/%25/g, "%");
var testString:String = "\"\\\"\"";
ExternalInterface.call("showString", escape(testString));
function showString(msg) {
    console.log(unescape(msg));
    document.getElementById('messagebox').innerHTML = unescape(msg);
}

<div id="messagebox"></div>
函数showString(msg){
console.log(unescape(msg));
document.getElementById('messagebox')。innerHTML=unescape(msg);
}

@kjy112不,我假设ExternalInterface.call会正确转义我传递给它的数据。@holyvier@kjy112好的,JSON编码是在Flash之外完成的。我使用的只是一个桥。或者在JS端序列化它并反序列化:这不是一个合法的构造:
\uflash\uxml(Flash.Utilities.A.“);
还有更多的代码被…掩盖了吗?或者这就是代码实际上所说的吗?虽然“丑陋”的黑客攻击没有奏效,但下面的逃跑确实奏效了。尽管如此,解释还是足够广泛,足以带来积极的影响。