随笔-179  评论-666  文章-29  trackbacks-0

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相互通信(flex中调用js函数) -凯发k8网页登录

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

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

js部分:

          

注意,在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>
        
  
      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>



posted on 2009-06-27 10:32 alpha 阅读(26574) 评论(4)     所属分类: jquery javascript flex

评论:
# re: as与js相互通信(flex中调用js函数) 2012-08-24 16:17 |
谢谢 正需要呢 在学习这个地方 好多地方的帖子都不成功 赞一个  回复  
  
# re: as与js相互通信(flex中调用js函数)[未登录] 2012-10-08 16:11 |
感谢博主的分享  回复  
  
# re: as与js相互通信(flex中调用js函数)[未登录] 2013-05-07 22:19 |
你好。 我刚开始使用flex 对于这个不熟。 能不能告诉我下, 这样相互通信的话。 需要配置那些地方? 因为我按照你这个写 调用不了。  回复  
  
# re: as与js相互通信(flex中调用js函数) 2013-11-22 12:48 |
这个addcallback为什么只能在ie中有用啊,其他浏览器都没有用 这个兼容的问题好像不好解决呢,看了很多这方面的资料都不能解决。  回复  
  

只有注册用户后才能发表评论。


网站导航:
              
 
网站地图