[原]as3 flash web 应用 (5)js与flash的交互
发布时间:2020-12-15 06:46:50 所属栏目:百科 来源:网络整理
导读:2010年06月17日 星期四 19:21 由于某度过于恶心等众所周知的原因,搬离写了5年的渣度空间,准备把技术性的文章定在CSDN了。这些都是文章备份。勿怪。。 (鉴于最近有些抓取机器和抄袭者,把标题的【原】字都复制,我不得不声明:本文为 yukon12345原创,转载
2010年06月17日 星期四 19:21 由于某度过于恶心等众所周知的原因,搬离写了5年的渣度空间,准备把技术性的文章定在CSDN了。这些都是文章备份。勿怪。。 完成了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远远不止如此,是件非常繁琐而精细的事情。因此讲完原理后,下面就要讲如何正确加载 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |