开发者社区> 范大脚脚> 正文

AS与JS相互通信(Flex中调用js函数)

简介:
+关注继续查看

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”]; 
   } 


onload=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> 



本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4164233.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
a 标签中调用js的几种方法
 我们常用的在a标签中有点击事件: 1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题,而且javascript:协议作为a的href属性的时候不仅会导致不必要的触发window.onbeforeunload事件,在IE里面更会使gif动画图片停止播放。
944 0
在mongodb服务器上存储和执行 js 函数 - 存储过程
虽然官方不推荐使用将业务逻辑存储在数据库中,并且提示在 mongodb 中执行 javascript 存在性能限制。 但实际上,将 javascript 函数存储在 mongodb 中执行,还是非常有必要的,更方便,许多场景下性能会更好(在执行大量查询处理时不需要将数据传回客户端引擎)。 在目前的版本中,我们任然可以将 javascript 函数存储在 mongodb 内置的一个特殊集合 db.system.js 中,然后这些变量就可以在任何 mongodb 的 javascript 上下文中调用,包括:db.eval()、$where子句、mapReduce。 自从 mongodb 3
143 0
百度地图的js调用
百度地图的js调用
1153 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
20693 0
C#跨窗体相互调用对方函数
对象对象程序设计,为跨窗体调用提供了良药:即构造函数。只要将某一个窗体对象以参数形式传入到另一个窗体对象的构造函数,即可实现。 一、实际案例需求 图1 Form1窗体设计   图2 Form2窗体设计   如图1、图2,现在要求图1按下按键,自己锁住,弹出图2;然后图2按下按键,自己关闭,解放图1的按键。
1024 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18995 0
重学计算机组成原理(六)- 函数调用怎么突然Stack Overflow了!
用Google搜异常信息,肯定都访问过Stack Overflow网站 全球最大的程序员问答网站,名字来自于一个常见的报错,就是栈溢出(stack overflow) 从函数调用开始,在计算机指令层面函数间的相互调用是怎么实现的,以及什么情况下会发生栈溢出 1 栈的意义 先看一个简单的C程序 function.
1054 0
Node.js调用mysql的存储过程
例子仅在windows下测试通过,没有放在linux下测试。如有问题,可以电邮给我~ 1、安装node.js、mysql,此处略(自行搜索吧)…; 2、创建一个名为test的数据库,然后建一张名为user_info的表(仅供测试)… 这里假定mysql使用的用户名为root,密码为123456 相应...
972 0
+关注
3656
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载