现在的位置: 首页 > 综合 > 正文

[原]as3 flash web 应用 (5)js与flash的交互

2014年02月08日 ⁄ 综合 ⁄ 共 2256字 ⁄ 字号 评论关闭

2010年06月17日 星期四 19:21

由于某度过于恶心等众所周知的原因,搬离写了5年的渣度空间,准备把技术性的文章定在CSDN了。这些都是文章备份。勿怪。。
(鉴于最近有些抓取机器和抄袭者,把标题的【原】字都复制,我不得不声明:本文为 yukon12345原创,转载请注明出处http://blog.csdn.net/yukon12345)

完成了UI的操作和上传功能,接下来就是as3和js的交互。

先普及下知识:
as和js的关系比较有趣,区别于其他互相相似的语言,以形象点方式的说,as和js实质上是同父异母的兄弟关系。
它们的父亲就是ECMA(它们都遵循ECMA标准),而“母亲”分别是著名的adobe公司和netscape,
由于遵循ECMA标准,基础核心对象和函数(方法)几乎是一模一样。而as和js两兄弟在网页前端领域的地位也是数一数二。
虽然actionscript3是走类java的传统面向对象路线,javascript反而是则是类C的函数式语言(不过也有特殊的原型继承机制和面向对象方法)。

回归正题。其实as3和js的交互非常简单,关键是如何检测flash影片在网页中加载完毕,之后两者才能交互。如果不检测,将会导致很多问题。如在flash里注册的函数并不能调用,空对象等等

关于交互:使用ExternalInterface类的静态方法【ExternalInterface.call()】即可调用同一页面中的js函数使用静态方法【ExternalInterface.addCalBack()】即可让js调用as内的方法。
另外还有一个静态属性ExternalInterface.available用来检测容器
例子:

1. ExternalInterface.call(函数名:string,参数1:string|int,参数2...)
特别注意:js能接受的参数1,参数2只能是string或者int类型,而且它不能自动转型
比如在AS3中有一个对象A有公共属性B,那么如果想A.B做参数的话必须都先String(A.B),来这样当做参数。

函数名指想调用的js的函数名,参数1,参数2等是传递给js函数的参数。
具体实现:在as的某个类中:
ExternalInterface.call("sendToJS", “发给js的字”);
而在js中:function sendToJS(text){alert(text)}

2. ExternalInterface.addCalBack(函数名:string,闭包名)
这里的函数名指的是js的函数名,指响应哪一个js函数。而闭包指的是一个as3函数的引用。
如 :在js中,

function thisMovie(movieName) {//此为获取影片
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName];
} else {
return document[movieName];
}
}

function sendToAS(text) {//js发送函数
thisMovie("ExternalInterfaceExample").sendToAS(text);
//“ExternalInterfaceExample”为flash嵌入时候的ID
}
sendToAS("这里是从js发出的参数")

在flash中:

ExternalInterface.addCallback("sendToAS", receivedFromJS)

function receivedFromJS(text){
trace("js:"+text)
}

别急着测试,关键在于如何检测flash影片加载完毕。官方的方法是在js中设置一个布尔变量,比如
js:

var jsReady = false;
function isReady() {//返回此标量。供flash调用。
return jsReady;
}

然后在body标签的onload事件中写入加载完成时执行处理函数

<body onload="pageInit();">
function pageInit() {
jsReady = true;
}

而在flash中,设定一个定时器,定时取jsReady变量值。
as3:

var readyTimer:Timer = new Timer(100, 0);
readyTimer.addEventListener(TimerEvent.TIMER, timerHandler);
readyTimer.start();

function timerHandler(event:TimerEvent):void {
trace("检查是否准备完毕。。")
var isReady:Boolean = checkJavaScriptReady();
if (isReady) {
output.appendText("JavaScript is ready.\n");
Timer(event.target).stop();
}
}

function checkJavaScriptReady():Boolean {
var isReady:Boolean = ExternalInterface.call("isReady");
return isReady;
}

详细的程序实现可以到 官方的ActionScript3·0语言和组件参考 里 查找“javascript”

是不是很麻烦?正确加载flash远远不止如此,是件非常繁琐而精细的事情。因此讲完原理后,下面就要讲如何正确加载

抱歉!评论已关闭.