将 Base64 字符串从 AS3 返回到 Javascript.这是一个错误或功能(还是我错了?
Returning Base64 string from AS3 to Javascript. Is this a bug or feature (or am I wrong?)
在我最近开发一个更大的项目时,我遇到了AS3 ExternalInterface
的奇怪行为,当试图将Base64编码的数据从AS3发送到Javascript时。我已将代码精简为最简单的版本,如下所示:
TestSWF.as
文件:
package {
import flash.external.ExternalInterface;
import flash.display.Sprite;
public class TestSWF extends Sprite {
public function callTestSWF():String {
var strToRet:String = '/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+';
trace(strToRet);
return strToRet;
}
public function TestSWF() {
ExternalInterface.addCallback("CallTestSWF", callTestSWF);
}
}
}
此文件使用 Flex-SDK 4.6 编译,使用
mxmlc -output test.swf -compiler.omit-trace-statements=false -static-link-runtime-shared-libraries -- TestSWF.as
对应的index.html
文件为:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test SWF</title>
</head>
<body style="font-family:sans-serif;">
<script>
function getStr() {
var flash = document.getElementById('swfObj');
var outText = flash.CallTestSWF();
document.getElementById('fromFlash').innerHTML = outText;
}
</script>
<input type="button" onclick="getStr();" id="sendToFlash" value="Call Flash"/>
<hr/>
<pre id="fromFlash">---</pre>
<hr/>
<embed id="swfObj" src="test.swf">
</body>
</html>
现在,当这个index.html
由Web服务器公开并且客户端浏览器配备了flash播放器的调试版本(v.20.0)时,我收到一个非常奇怪的警告
WARNING: For content targeting Flash Player version 14 or higher, ExternalInterface escapes strings using JSON conventions. To maintain compatibility, content published to earlier Flash Player versions continues to use the legacy escaping behavior.
值得一提的是,任何地方都没有使用JSON
。请注意,从 AS3 返回的字符串包含 Base64 代码中使用的完整字符集。删除"/
"时,此警告将消失。
这是一个错误还是这种烦人行为的解释是什么?欢迎任何评论。
每当您将特殊字符传递过去以不同方式转义的ExternalInterface
时,就会发生这种相当烦人的警告。在大多数情况下,您可以忽略它。
详细说明:在Flash Player 14之前,用于转义通过ExternalInterface
的字符串的内部方法存在许多问题(例如JS注入漏洞),导致开发人员提出了正则表达式的解决方法。当 Flash Player 14 中的转义行为被更改(使用 JSON 约定)时,它可能会破坏许多开发人员先前的修复,因此他们选择支持针对旧玩家的 SWF 的旧版转义行为,而不是仅仅发布重大更改,并在字符串通过包含字符的ExternalInterface
时发出警告开发人员可能试图以某种奇怪的方式进行转义以支持旧版转义行为, 这将破坏新行为。换句话说,此警告并不是说您做错了什么,而是让您意识到Flash Player中的行为已更改了您正在使用的某些字符串。如果字符串按预期工作,则警告不是问题,您无需执行任何操作。这就是为什么我说它"烦人"。它基本上是一个"旧版 API 警告",除了 API 是相同的,它是现有 API 的行为,具有您可能需要注意的旧行为。
如果你在互联网上搜索,你会发现这个故事的片段到处都是。
如果您真的希望警告消失,您可以对特殊字符进行编码。根据我的经验,最简单的方法是在另一端使用 encodeURIComponent
和 decodeURIComponent
:
.HTML:
<script>
function getStr() {
var flash = document.getElementById('swfObj');
var outText = decodeURIComponent(flash.callTestSWF());
document.getElementById('fromFlash').innerHTML = outText;
}
</script>
AS3:
public function callTestSWF():String {
var strToRet:String = encodeURIComponent('/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+');
trace(strToRet);
return strToRet;
}
或者您可以使用正则表达式,但就您个人而言,在您的情况下,我只会忽略警告,知道您的代码正常工作并且不会引入一些脆弱的正则表达式。
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- 预期响应包含一个对象,但在angular js中得到一个数组错误
- 错误:$injector:modulerr模块错误(我的第一个SPA应用程序)
- 一个ajax循环有两个输出错误innerHTML
- 在量角器中创建一个.txt错误输出文件是手动的,而不是控制台错误
- 我怎么能把一个错误当作未捕获的错误来记录呢
- 我需要一个jQuery函数来只工作在700px以上的屏幕大小,无法在我的代码中发现错误
- 在这个使用hasOwnProperty的对象扩展程序中有一个错误,I'我不确定那个bug是什么,也不确定这个扩展
- 从另一个JSAppleScript运行另一个JS AppleScript时出现权限错误
- 当张贴到数据库时,I'我得到了一个“;可以't在它们被发送错误之后设置报头”;
- javascript window.location在检查firebug时给了我一个错误的url路径
- 调试器;[错误]194:11:标识符是一个保留字
- new SharedWorker(“whatever.js”)返回一个错误
- 页面上的2个表单带有JS验证-其中一个抛出电子邮件验证错误
- JQuery关注上一个点击的输入错误
- 在一个函数中,我有一个未捕获的语法错误:意外的标记else
- 未捕获的引用错误——一个函数工作而另一个不起作用
- 图表API错误——[一个或多个参与者未能绘制()]