Actionscript3 到 JavaScript 的通信:最佳实践
Posted
技术标签:
【中文标题】Actionscript3 到 JavaScript 的通信:最佳实践【英文标题】:Actionscript3 to JavaScript communication: best practices 【发布时间】:2010-09-23 16:41:36 【问题描述】:在比 a previous question 更抽象的层面上,根据我的经验,有 3 种方法可以使用 AS3 从嵌入式 .swf 调用 html 页面上的 javascript 函数:ExternalInterface、fscommand 和 navigateToURL。
让我们比较和对比这些方法(也许还有我没有列出的其他方法)并讨论每种方法的优缺点 - 现在,ExternalInterface 似乎在灵活性方面是可行的方法,但它适用于所有情况吗?在执行速度或类似方面是否有具体的好处?我很好奇——我们怎么看?
【问题讨论】:
【参考方案1】:这完全取决于您是否希望通信是同步的,因为ExternaInterface
可以返回数据,因为navigatoToURL
和fscommand
是异步的并且只能调用javascript 函数;它们不能返回值或响应。
来自与外部接口相关的实时文档:
通过 ActionScript,您可以在 HTML 页面上执行以下操作:
调用任何 JavaScript 函数。 使用任意名称传递任意数量的参数。 传递各种数据类型(布尔、数字、字符串等)。 从 JavaScript 函数接收返回值。通过 HTML 页面上的 JavaScript,您可以:
调用 ActionScript 函数。 使用标准函数调用表示法传递参数。 向 JavaScript 函数返回一个值。
flash.external.ExternalInterface
类是flash.system.fscommand
类的直接替代品。
因此,使用 ExternalInterface 是 flash 和 Javascript 函数之间的首选方法或通信,但如果调用只是异步调用,则可以使用 flash.net.navigateToURL
。
【讨论】:
【参考方案2】:外部接口
您可以从 JS-AS 和 AS-JS 调用中获取返回值 对参数进行编码(使用数组、对象等调用。无需对其进行编码) 跨浏览器 发送 HTML 或 JSON(特殊编码)时有缺陷,它breaks internally获取网址
只能调用JS,无法获取返回值,需要对数据进行编码 比弃用更好,在 Flash 10 中它已被删除 确实被移除了,所以不要使用它;)fscommand
来吧,ExternalInterface 是解决方案(2008 年)。【讨论】:
说得好 - flash 10 中的弃用和随后的删除对我来说很重要。【参考方案3】:创建ExternalInferface 是为了使JS 和Flash 之间的通信更容易,因此使用其他任何东西都没有任何意义。常见的做法是在调用某些 JS 之前,首先通过评估 ExternalInterface.available 属性的值来检查其是否可用。此属性告诉您要从中调用某些 JS 的 SWF 是否位于提供外部接口的容器内。换句话说,如果使用 ExternalInterface 将起作用。如果它不可用,那么只需使用 flash.net.sendToUrl。切勿使用 fscommand(),因为它使用 VBScript,并且可能会导致与页面上的其他 VBScript 发生冲突。此外,您只能使用 fscommand 发送一个参数字符串,并且必须在 JS 端将其拆分。
【讨论】:
好的 - 我喜欢它,这就是它的用途,VBScript 的东西,单参数的东西,以及作为替代的 navigateToURL - 所以,当你检查 ExternalInterface 的可用性时,你是检查 Flash 端,还是以某种方式检查 javascript 是否存在?以上是关于Actionscript3 到 JavaScript 的通信:最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
actionscript3 ArgumentError:错误 #2015:位图数据无效
使用 Actionscript3 将图片从 XML doc 导入 Flash
用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 在脚本中使用MonoBehaviour