我对Flash 10和ExternalInterface有一个非常奇怪的问题。我目前正在使用自制网桥使用带有Javascript的RTMFP,每当我尝试传递包含JSON的数据时,我都会收到来自Flash的奇怪的Javascript错误:
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 :(得分:22)
这显然是一个众所周知的问题,似乎Adobe不会很快修复它。
我发现了detailled explaination此问题,基本上问题似乎是Flash无法正确处理\
和&
,这可能会导致javascript错误或数据损坏在从Flash转移到javascript期间。
当您将数据从Flash传输到JS时,Flash尝试执行的操作是执行以下操作:
try {
__flash__toXML(yourJavascriptFunction("[DATA]")) ;
} catch (e) { "<undefined/>"; }
问题在于它会将您的数据保持原始状态,并且根本不会逃避反斜杠。如果您的字符串仅包含\
,并且您想在其上调用console.log
,则会尝试执行以下操作:
try {
__flash__toXML(console.log("\")) ;
} catch (e) { "<undefined/>"; }
正如您所看到的,这是无效的javascript。它会在您的Javascript控制台中引发错误,并且永远不会调用console.log
。
解决方案是使用闪存行为或做一些讨厌的黑客来解决它。
为了清除闪光灯的问题,你可以在转移它们之前逃避黑色闪光。这个解决方案现在可以使用了,但是当Flash修复它时(很可能不会在不久的将来,如果你认为这个bug已经超过4年了),它将会破坏你的应用程序。
另一种可能性是对Flash无法正常处理的字符(\
,"
,&
)进行网址编码,并在另一侧对其进行解码。
Flash:
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, "%");
这很难看,但确实有效。
答案 1 :(得分:6)
不可否认,这不会直接直接输出到Firebug中的控制台,但对于大多数其他应用程序(即向Javascript发送可能“无效”的字符串),escape
和{ {1}}应该可以正常工作:
<强> AS3:强>
unescape
然后在 Javascript:
var testString:String = "\"\\\"\"";
ExternalInterface.call("showString", escape(testString));