当我使用 JSON 之类的字符串传递参数时,为啥 ExternalInterface 会中断?
Posted
技术标签:
【中文标题】当我使用 JSON 之类的字符串传递参数时,为啥 ExternalInterface 会中断?【英文标题】:Why does ExternalInterface breaks when I pass parameter with JSON like string?当我使用 JSON 之类的字符串传递参数时,为什么 ExternalInterface 会中断? 【发布时间】:2011-07-06 04:24:42 【问题描述】:我对 Flash 10 和 ExternalInterface 有一个非常奇怪的问题。我目前正在使用自制网桥将 RTMFP 与 javascript 一起使用,每当我尝试传递包含 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);
我可以做些什么来避免这个问题,这是一个已知问题吗?
【问题讨论】:
@kjy112 不,我假设 ExternalInterface.call 将负责正确转义我传递给它的数据。 @holyvier maccherone.com/larry/projects/… @kjy112 JSON 编码是在 Flash 之外完成的。我使用的只是一座桥梁。 或者在JS端序列化和反序列化:snipplr.com/view/6494/… 这不是一个合法的构造:__flash__toXML(Flash.Utilities.A..."")) ;
是否还有更多的代码被你屏蔽了......或者这就是代码实际所说的内容?
【参考方案1】:
这显然是一个已知问题,而且 Adobe 似乎不会很快解决它。
我发现了这个问题的 detailled explaination,基本上问题似乎是 Flash 无法正确处理 \
和 &
,这可能导致在从 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 行为进行复制或进行一些讨厌的 hack 来绕过它。
要ducktape Flash buggyness,您可以在传输之前避开黑斜线。这个解决方案现在可以工作,但是当 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, "%");
它很丑,但它有效。
【讨论】:
“丑陋”的黑客没有奏效,但下面的逃跑却奏效了。解释仍然足够广泛,可以带来积极的影响。【参考方案2】:诚然,这对于在 Firebug 中输出到控制台并直接起作用,但对于大多数其他应用程序(即向 Javascript 发送潜在的“无效”字符串),escape
和 unescape
应该可以正常工作:
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>
【讨论】:
以上是关于当我使用 JSON 之类的字符串传递参数时,为啥 ExternalInterface 会中断?的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试将 Get API 中的 json 对象作为 C# ASP.Net 中的查询字符串参数传递时,Swagger 给出错误
当我从 Angular 传递 graphql 查询时,为啥 GraphQL 控制器中的参数查询为空?
无法将 Tableview 单元格值添加到 JSON 参数,为啥会为零?迅速