Flash 8 中 javascript 通讯(译)

最近在解决 Javascript 和 flash 通讯这个问题,google 了一篇文章,不算很新但概括的很好,特别译出来大家看看,活有点糙,大家见谅。

Flash 与 Javascript 的整合现在在 Flash 8 中跨越了一大步,因为引进了External Interface!这项在 Flash 8 中出现的全新特征使 Flash 和它的 host 之间的通讯变的更加容易。大多数人将会用这项技术来加强 Flash与 Javascript 的整合。这篇文章向您展现了使用这项技术有多么的容易,它将使您胃口大开并且开始思考如何在您的应用中使用这项新技术。

旧的技术:
在过去, Flash 与 Javascript 的通讯依靠 fscommand 函数,一项充满了 Bug 而且并不简单的技术。实际上,它是如此的糟糕以至于程序员通常宁愿把 Javascript 函数放在 getURL 函数中去达到相同的目的,这样做没有问题,但是通讯却绕了一个大圈。

Mike Chambers and Christian Cantrell 发布了 Flash/JavaScript Integration Kit ,来为两种技术的通讯提供了一个更好的方法。这项技术容易实现,但是仍然建立在一些旧的技术基础之上,我们需要全新的技术。

新的技术:
Flash 8 引入了一种全新的技术来整合 Flash 和它的 host (External Interface)。这使得 Flash/Javascript 的整合更加强大而稳定,使用起来也非常容易。External Interface 为 Flash 8 的开发者提供了如下优点:容易实现;允许同步通讯;支持传输更广泛的数据类型,包括 object 。

External Interface 是一个非常容易实现的技术。就像您将要看到例子中的那样,只需要在 Flash 或 Javascript 端写寥寥几行代码就可以。用 Fscommand 需要在页面中写大量的 Javascript/VBScript 代码来调用 Javascript 函数。而这里在 Flash 中写的代码就是调用 javascript 函数的调用函数本身。没错,Flash 可以调用 SWF 所在的页面中的任何 Javascript 函数而不用另外增加任何 Javascript 代码。从 Javascript 到 Flash 的通讯也同样容易,在 Javascript 中所有要做的的事情就是得到 HTML object 或者嵌入的 tag(取决于浏览器)的 id 然后调用 ActionScript 函数。在 Flash 的应用中,您只需要保证 External Interface 的 addCallback 函数所用的方法有效就可以了,详见下文。

Fscommand 不能用于同步通讯。因此如果要做一个循环的话,Flash 需要调用一个 Javascript 函数,然后做回转然后用 SetVariable 去创建一个 Flash 影片中的变量。整个过程 Flash 一直在检查这个变量是否已经创建了。这样的通讯过程显然绕的太远了。External Interface 允许您去调用一个 Javascript 函数并且接收一个返回值。这简化了逻辑而且打开了通向更复杂应用的大门。

Fscommand 允许您传送一个 primitive 类型的初始值做为调用函数的参数,但是现在,有了 External Interface,您可以发送更复杂的 object 类型做为参数。在下面的实例 2 中,我们向 Javascript 传回了 object 类型的整个 system.capabilities 对象。

我知道您在想什么:“External Interface 这是太棒了,但是它真的能工作在所有的浏览器中吗?”,请看下表(当然这里只是指 Flash 8 ):
Internet Explorer 5.0+ (Windows)
Netscape 8.0+ (Windows & Macintosh)
Mozilla 1.7.5+ (Windows & Macintosh)
Firefox 1.0+ (Windows & Macintosh)
Safari 1.3+ (Macintosh)

Flash 对 Javascript 的通讯实例:

在 Flash 对 javascript 的通讯实例中,我们通过调用 Javascript 脚本来得到其所在页面的 URL。(在 Flash 中我们只能得到 SWF 的 URL,而不是其所在的页面的 URL。)这是个非常简单的例子,迅速向 Flash 中发送了一个 string。

您不需要做任何多余的事情来使 Javascript 函数对 Actionscript 有效。在下面的例子中,您可以看到我们创建了一个叫 getLocation 的函数来返回页面的 URL:

<script language="JavaScript">
function getLocation() {
  return window.location.toString();
}
</script>

而在 Flash 一端,我们所需要做的全部就是用 External Interface 类的 call 方法调用 Javascript 函数。上述过程要用 button 的 Click 事件来触发,所以需要在 button 上加一个 listener,再用 input 的 text 属性来显示调用 Javascript 函数的结果。这些在早期的 Flash 版本中是不可能实现的因为它们不支持同步通讯。下面的代码展示了在 Flash 中调用 Javascript 函数是多么的简单:

import flash.external.ExternalInterface;
function displayPageLocation():Void {
  locationDisplay.text = ExternalInterface.call("getLocation");
}
locationButton.addEventListener("click", mx.utils.Delegate.create(this, displayPageLocation));

javascript 对 Flash 的通信实例:

在这个的实例中,我们只是将上个实例中的 String 换成了 object。我们从 Flash 中返回了 system.capabilities 对象,然后遍历了这个对象并将结果输出到 textarea 中。

要使 Flash 函数对 Javascript 有效只需调用 External Interface 的一个静态方法 addCallback。这个方法有三个参数:第一个参数是 javascript 所调用的 ActionScript 函数名,第二个是本函数所属的对象名,第三个是这个函数本身的名字;就像您在下面的例子中要看到的那样,这个函数非常简单只是返回了  system.capabilities 对象给Javascript 函数。

import flash.external.ExternalInterface;
function getFlashInfo():Object {
  return System.capabilities;
}
ExternalInterface.addCallback("getFlashInfo", this, getFlashInfo);

在 Javascript 端,首先要做的事就是得到要传送的 object 的在页面中的名称。既然这些标签在页面完全载入之前不会有效,所以我们需要把这些标签放在 window.onload 函数中:

<script language="JavaScript">
var flash;
window.onload = function() {
  if(navigator.appName.indexOf("Microsoft") != -1) {
    flash = window.flashObject;
  }else {
    flash = window.document.flashObject;
  }
}
</script>

当页面中 button 的 click 事件触发时,下面所示的 displayFlashInfo 函数将会被调用。这个函数调用了 Flash 中的 getFlashInfo 函数并把它的返回值赋给了 flashInfo 变量。再遍历这个对象并且把其属性输出到 textarea 中。下面的代码演示了 Javascript 调用一个 ActionScript 中的函数是多么容易,也证明了 External Interface 可以传递 object。

<script language="JavaScript">
function displayFlashInfo() {
  var flashInfo = flash.getFlashInfo();
  for(var key in flashInfo) {
    document.flashForm.flashInfoDisplay.value += key + ": " + flashInfo[key] + "/n";
  }
}
</script>

在写Flash/javascript 通讯的代码时,您可能需要以下<form>中代码。它包括了一个 textarea 和一个 button。当 button 的 click 事件触发,它调用上面的所示的 displayFlashInfo 方法。

<form name="flashForm">
<textarea name="flashInfoDisplay" style="width:390px;height:300px;"></textarea>
<input type="Button" value="Get Flash Info" name="flashInfoButton" οnclick="javascript:displayFlashInfo();" style="width:100px;" />
</form>

结论:

正如您所看到的那样, External Interface 的出现是 Flash/Javascript 通讯的巨大进步。这篇文章展示了这项技术容易使用并有一些令人印象深刻的新特征。

实例一
http://www.communitymx.com/content/article.cfm?page=2&cid=0922A
实例二
http://www.communitymx.com/content/article.cfm?page=3&cid=0922A

原文:JavaScript Integration in Flash 8
地址:http://www.communitymx.com/content/article.cfm?page=1&cid=0922A
作者:Danny Patterson  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值