博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AS与JS相互通信(Flex中调用js函数)
阅读量:6513 次
发布时间:2019-06-24

本文共 5094 字,大约阅读时间需要 16 分钟。

转载自

Flex中As调用Js的方法是:

     1、导入包 (import flash.external.ExternalInterface;)
     2、使用ExternalInterface.call("Js函数名称",参数)进行调用,其返回的值就是Js函数所返回的值
 
Js调用As的方法是:
     1、导入包 (import flash.external.ExternalInterface;)
     2、在initApp中使用ExternalInterface.addCallback("用于Js调用的函数名",As中的函数名)进行注册下
     3、js中 就可以用document.getElementById("Flas在Html中的ID").注册时设置的函数名(参数)进行调用

as和js通信addcallback失效

参考原文:http://www.zhaohongri.cn/?p=14

情况一:flash一旦在浏览器里cache住,如果在as里一开始就addcallback就会失效
情况二:一个js函数上来就调用as的一个函数的时候,页面会报错,提示找不到这个flash对象,或者函数没有定义。Flash8的时代,针对 ExternalInterface这个类,文档里只说明了怎么用,而没有具体说怎么合理的组织和页面的结构,一直到了cs3的时代,帮助里才说明了正确 的函数注册和js调用的过程,具体的见Flash cs3帮助。大概的代码如下:

js部分:

           <script>

var jsReady=false;
var swfReady=false;

function isReady(){

return jsReady;
}
function setSwfIsReady(){
      swfReady=true;
   getSWF(”flashobj”).fun()

}

function pageInit(){

     jsReady=true;
}

function getSWF(movieName) {

   if (navigator.appName.indexOf(”Microsoft”) != -1) {
    return window[movieName+”_ob”];
   } else {
    return document[movieName+”_em”];
   }
}

οnlοad=function(){

   pageInit();
}

</script>

注意,在getSWF函数里用了 return window[movieName+”_ob”]和return document[movieName+”_em”],在IE下,如果object标签和embed表现用同样的id,通过js去访问flash对象的时 候,IE会认不出,FF是没有问题的

as部分

private function registerJsFun():void{

       if(ExternalInterface.available){
     try{
      var containerReady:Boolean=isContainerReady();
      //ExternalInterface.call(”ceshi”,”registerJsFun:”+containerReady);
      if(containerReady){
       //注册函数
       setupCallBacks();
      }else{
       //检测是否准备好
       var readyTimer:Timer=new Timer(100);
       readyTimer.addEventListener(TimerEvent.TIMER,timeHandler);
       readyTimer.start();
      }
     }catch(error:Error){
      trace(error)
     }
    }else{
     trace(”External interface is not available for this container.”);
    }
   }
  
private function timeHandler(event:TimerEvent):void{
var isReady:Boolean=isContainerReady();
      if(isReady){
   Timer(event.target).stop();
   setupCallBacks();
}
}
private function isContainerReady():Boolean{
var result:Boolean=Boolean(ExternalInterface.call(”isReady”));
return result;
}
private function setupCallBacks():void{
       ExternalInterface.addCallback(”fun”,fun);

        ExternalInterface.call(”setSwfIsReady”);

     }

具体我就不解释了,不明白的可以仔细去看下cs3帮助,大概的意思就是页面开始渲染的时候js去调用swf对象,有可能swf对象没有完全 load完,所以这个触发器要从flash开始,当flash加载的时候就开始不停的调用页面的一个函数,取一个页面是否加载完毕的标识,当 pageonLoad后,这个标识为true了,说明flash也加载完毕了,这个时候flash再开始注册函数,同时调用页面的js,让js调用 Flash对象

实例:a.mxml 

<? xml version="1.0" encoding="utf-8" ?>
< mx:Application  xmlns:mx ="http://www.adobe.com/2006/mxml"  layout ="absolute" >
     < mx:Script >
         <![CDATA[   
      import flash.external.*;
      public function asFunc():String {
          return sending_ti.text;
      }
      
      public function initApp():void {
        //AddCallback方法允许javascript调用flash时间上函数 
          ExternalInterface.addCallback("flexFunctionAlias", asFunc);
      }
      
         public function callWrapper():void {      
             var f:String = "changeDocumentTitle";
       //ExternalInterface.call(functionName:String,Parameters)可以调用javascript函数
       //参数1: functionName – 你想要调用的javascript函数名要以字符串的形式
       //参数2: Parameters – 需要传递给javascript函数的参数,用逗号分开,是可选的。              
             var getJSValue:String = ExternalInterface.call(f,"New Title");
             received_ti.text = getJSValue;
        }
         ]]>
     </ mx:Script >
     < mx:Button  id ="send_button"  x ="368"  y ="100"  click ="initApp();"  label ="发送"  fontSize ="12"  width ="62" />
     < mx:TextInput  id ="received_ti"  x ="148"  y ="62"  width ="203"  fontSize ="12" />
     < mx:TextInput  id ="sending_ti"  x ="148"  y ="100"  width ="203"  fontSize ="12" />
     < mx:Label  x ="105"  y ="65"  text ="收到"  fontSize ="12" />
     < mx:Label  x ="105"  y ="103"  text ="发送"  fontSize ="12" />
     < mx:Button  x ="368"  y ="64"  click ="callWrapper();"  label ="接收"  fontSize ="12"  width ="62" />
</ mx:Application >

index.html

<! DOCTYPE HTML PUBLIC "-//W3C//Dtd nowrap HTML 4.01 Transitional//EN" >
< html >
< head >
   < base  target ="_self" >
   < title ></ title >
   < meta  http-equiv ="Content-Type"  content ="text/html; charset=utf-8"   />
   < meta  http-equiv ="pragma"  content ="no-cache" >
   < meta  http-equiv ="cache-control"  content ="no-cache" >
   < meta  http-equiv ="expires"  content ="0" >
</ head >
< script  language ="JavaScript" >  
     function  callApp() {
         var  x  =  MyFlexApp.flexFunctionAlias();
        document.getElementById('receivedField').value  =  x;
    }
     function  changeDocumentTitle(a) {
        window.document.title = a;
         return  document.getElementById('sendField').value;
    }
</ script >
< body  style ='overflow-x:hidden;overflow-y:hidden' >
   < form  name ="htmlForm" >
     数据发送给AS:
     < input  type ="text"  id ="sendField"   />
     < input  type ="button"  value ="发送"  onclick =""   />< br  />
     < br  />
    接收AS的数据:
     < input  type ="text"  id ="receivedField" >
     < input  type ="button"  value ="接收"  onclick ="callApp();"   />< br  />     
   </ form >
    < OBJECT  id ="MyFlexApp"  classid ="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase ="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"  WIDTH ="100%"  HEIGHT ="500" >
       < PARAM  NAME =movie  VALUE ="joinJS.swf" >
       < PARAM  NAME =quality  VALUE =high >
       < PARAM  NAME =scale  VALUE =noborder >
       < PARAM  NAME =bgcolor  VALUE =#000000 >
       < EMBED  src ="joinJS.swf"  quality =high  WIDTH ="100%"  HEIGHT ="500"  scale =noborder  bgcolor =#000000  NAME ="TH2" TYPE ="application/x-shockwave-flash"  PLUGINSPAGE ="http://www.macromedia.com/go/getflashplayer" ></ EMBED >
    </ OBJECT >
</ body >
你可能感兴趣的文章
Redis客户端redisson实战
查看>>
连接到 JasperReports Server
查看>>
java处理高并发高负载类网站问题
查看>>
使用C#生成随机密码(纯数字或字母)和随机卡号(数字与字母组合)
查看>>
CAS服务器端集群
查看>>
设计模式 之 访问者模式
查看>>
JAVA Collections框架
查看>>
更改Windwos server 2003 域用户密码策略默认配置
查看>>
进制转换
查看>>
html与html5的一些区别
查看>>
ASCII码
查看>>
java常用四种排序源代码
查看>>
win7 下硬盘安装Redhat7
查看>>
Redis 分布式锁的正确实现方式
查看>>
mysqldump 备份命令使用中的一些经验总结
查看>>
Linux下MySql安装配置方法总结
查看>>
本IT博客用于域名投资、互联网、资源下载等相关干货收藏和学习
查看>>
ArrayList底层实现
查看>>
【转载】Java程序设计入门 (二)
查看>>
单词最近距离
查看>>