AS3 Flash - 通过 ExternalInterface 渲染 html

Posted

技术标签:

【中文标题】AS3 Flash - 通过 ExternalInterface 渲染 html【英文标题】:AS3 Flash - render html via ExternalInterface 【发布时间】:2012-11-17 16:22:30 【问题描述】:

这是我关于 Stack Overflow 的第一个问题。这不是我第一次想写一个,但通常我会使用搜索栏找到解决方案,这次我没有。我要解决的问题有点复杂,所以我会尽量做到彻底。

基本上,我们正在将中国支付添加到现有的 Flash 电子商务中。整个网站在 AS3 中,使用 SWFObject 嵌入,已经使用 ExternalInterface 进行其他操作。

这种新的中国支付方式有点过时,所以他们处理支付的方式很奇怪。一旦我们向他们的服务器发送了包含所有订单详细信息的 POST,他们就会以 html 页面进行响应。我的问题是渲染这个页面,考虑到我在 Flash 中收到它。

我目前尝试的解决方案部分有效,这意味着我可以看到页面,但是应该在页面中的中文字符呈现得很糟糕。我看到的不是中文字符,而是奇怪的字符,所以我猜测当我将 HTML 从 Flash 传递到 javascript 时一定存在编码问题。我就是这样做的:

AS3:

//extract html page from response
var newHTML:String = e.currentTarget.data;
//trim whitespace to avoid javascript error
newHTML = newHTML.replace(/\n/g, '');
newHTML = newHTML.split("\r").join("");

if(ExternalInterface.available)
  ExternalInterface.call("chinesePayment('"+newHTML+"')");
else
  trace("External interface error");

Javascript:

function chinesePayment(param) 
  var newWindow = window.open();
  //var unescaped = unescape(param);
  newWindow.document.write(param);

我尝试过使用 unescape、escape、URIencoding 但没有任何成功,所以我真的希望你能在这里帮助我!

谢谢, 多梅尼科

编辑:

我只想提一下,我从他们的服务器收到了正确的 HTML 页面。我尝试在本地保存页面,直接从服务器响应复制 HTML 代码,并且页面视图正确。这意味着在将页面从 AS3 传递到 Javascript 的过程中肯定有问题。

EDIT2 !important:

我意识到问题在于弹出编码。当我从弹出窗口复制 HTML 时,将其粘贴到编辑器中并保存,我可以正确查看 HTML。似乎弹出窗口不考虑 gbk 编码。我现在正在寻找解决这个问题的方法。

【问题讨论】:

如果您通过说 FileReference 转储该数据,然后以 HTML 格式打开它,它在浏览器中是否正常工作? 我没有尝试过,也因为这不是最终的解决方案。看到这个网站收到很多订单,我想避免为每个订单创建静态页面。无论如何,我尝试在 Flash 中插入断点,复制 html 并将其粘贴到编辑器中。一旦我保存了该文件,它就会正确呈现,因此 html 直到那里都很好。我会尝试这个解决方案,看看它是否有效,然后告诉你它是怎么回事。 不,我的意思是测试您是否收到正确的 HTML 页面,是否所有元数据设置正确,以及其他内容。如果通过文件传输它会在浏览器中正确形成,那么您会收到正确的 HTML,您需要进一步研究处理 HTML 字符串的 JS - 我不知道在处理过程中是否会出现故障。如果不是,那么您收到的 HTML 不正确/不完整,或者您的系统缺少字体,或者您观察到的行为存在其他一些非编程原因。 在这种情况下,我可以确认我收到了正确的 HTML 页面。当复制直接从服务器响应接收到的代码并将该代码保存到我计算机上的 HTML 文件中时,我正确地查看了该页面。我将编辑主要帖子添加此信息。谢谢! 根据这个site,以下代码应该使用encodeURIComponentunescape的组合对字符进行正确的UTF-8编码,尽管我不熟悉中文符号及其编码方式:newWindow.document.write(unescape(encodeURIComponent(param))); 【参考方案1】:

我终于找到了解决办法!!!!

基本上我必须在 Flash 中渲染汉字,这样当我将它们传递给 javascript 时,它们就已经被编码了。所以首先我必须将 URLLoaderDataFormat 的类型更改为 BINARY 以便我收到一个 byteArray:

my_loader.dataFormat = URLLoaderDataFormat.BINARY;

收到回复后,我就这样修改了代码:

        var bytes:ByteArray = e.currentTarget.data;
        var newHTML:String = bytes.readMultiByte(bytes.length,"gb2312");
        //trim whitespace to avoid javascript error
        newHTML = newHTML.replace(/\n/g, '');
        newHTML = newHTML.split("\r").join("");

        if(ExternalInterface.available)
            ExternalInterface.call("chinesePayment('"+newHTML+"')");
        else
            trace("External interface error");

如您所见,感谢特定的 byteArray 函数,我可以使用首选字符集读取响应,现在它可以工作了!

javascript 保持不变,没有转义或类似情况。通过这种方式,javascript 函数接收到一个包含中文字符的字符串,而不是等效的 utf 字符。

感谢大家,你们帮我找到了解决方案!

【讨论】:

以上是关于AS3 Flash - 通过 ExternalInterface 渲染 html的主要内容,如果未能解决你的问题,请参考以下文章

Flash as3如何通过鼠标事件停止播放子电影剪辑?

Flash / AS3 ...设计人员如何修改以编程方式添加的控件?

安全沙箱违规Flash AS3

AS3 flash 键盘事件空格键问题

FLASH AS3图片内存清除方法

如何在 Flash AS3 中从 URL 获取/获取变量