`

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

    博客分类:
  • Flex
阅读更多

目前,有些基于html的网页 内嵌了swf。html与swf之间的通信是很有必要的。从下面的文章中可以学到如何在flex代码中调用html页面的javascript函数。

附:html内嵌swf的代码

<object width="550" height="300">
<param name="movie" value="PTJ_Portal_Demo1.swf">
<embed src="PTJ_Portal_Demo1.swf" width="800" height="300">
</embed>
</object>

 

http://www.blogjava.net/Alpha/archive/2009/06/27/284373.html

 

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

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><? 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

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><! 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 >



分享到:
评论

相关推荐

    Flex与Javascript相互调用例子(附源码)

    标题 "Flex与Javascript相互调用例子(附源码)" 指涉的是一个技术主题,主要探讨了如何在Adobe Flex应用程序中与JavaScript进行交互。Flex是基于ActionScript 3.0的开源框架,用于构建富互联网应用(RIA),而...

    as与js方法的相互调用

    在跨平台应用开发中,经常会遇到ActionScript (AS)与JavaScript (JS)之间的交互需求,尤其是在Flex(一种基于Adobe Flash的开发框架)的应用中。Flex是使用ActionScript编写,而网页环境通常由HTML和JavaScript控制...

    JS与Flex通信、互转例子

    然后在JavaScript中,可以像调用本地函数一样调用Flex组件的方法: ```javascript var swf = document.getElementById('flexComponentId'); swf.jsFunctionName('parameters'); ``` Flex也能监听JavaScript...

    js调用as函数方法例子

    此外,为了安全原因,ActionScript只能调用在HTML页面中明确列出的JavaScript函数。 6. **性能考虑** 由于JavaScript和ActionScript之间的通信涉及到浏览器和Flash Player之间的跨域调用,因此可能会有性能开销。...

    Flex与JavaScript的相互通信(真情贡献)

    Flex与JavaScript的相互通信是Web开发中的一个重要技术,它允许富互联网应用程序(RIA)如Flex应用与网页中的JavaScript代码进行交互,实现更丰富的用户体验。本文将深入探讨这一主题,结合给定的压缩包文件...

    js flex通信代码示例

    4. **Flex调用JavaScript**: - 当Flex需要调用JavaScript函数时,可以使用`ExternalInterface.call()`方法: ```actionscript ExternalInterface.call("jsFunctionName", "参数1", "参数2"); ``` - JavaScript...

    flex和javascript交互例子

    标题"flex和javascript交互例子"指向了这个主题的核心——如何在Flex应用中调用JavaScript函数,以及反过来在JavaScript中调用Flex的方法。这种技术通常被称为“Bridge”或“跨域通信”。 在Flex中,我们可以使用`...

    Flex与Flash相互调用实例

    通过ExternalInterface,Flash可以调用JavaScript函数,而JavaScript也可以调用Flash中的方法。 在提供的压缩包文件中,包含了两个工程目录:一个为Flash程序,另一个为Flex工程。这表明你需要分别在Flash ...

    flex&flash相互调用

    在压缩包中的未命名-1.fla文件很可能是Flash的源文件,包含了可以被Flex调用的函数。 5. **开发工具**: 开发Flex应用程序通常使用Adobe Flex Builder或IntelliJ IDEA等集成开发环境,而Flash则使用Adobe Animate ...

    Flex3与javascript相互交互验证

    使用`ExternalInterface.call`方法,你可以从Flex应用中调用JavaScript函数。例如,你想在JavaScript中执行一个名为`myJSFunction`的函数,并传递参数`arg1`和`arg2`: ```as3 var result:Object = ...

    flex iframe js

    在IT行业中,`flex iframe js`是一个特定的技术领域,它涉及到使用JavaScript与Adobe Flex应用程序进行交互,特别是通过IFrame(内联框架)实现。本文将深入探讨这一技术,包括其工作原理、应用场景以及如何实现AS...

    Flex AcrionScript 和 JavaScript 通讯

    Flex ActionScript与JavaScript之间的通信是Web开发中的一个重要概念,它允许在Adobe Flash Player中的Flex应用程序与HTML页面上的JavaScript代码之间交换数据和控制交互。这种通信机制对于创建富互联网应用程序...

    flex中写js代码

    在Flex开发中,JavaScript(JS)代码的使用主要集中在与ActionScript(AS)的交互上,因为Flex主要是基于Adobe Flex SDK和Flash Player或Adobe AIR来创建富互联网应用程序(RIA)。以下是一些关于在Flex中使用...

    AS与JS交互

    3. **调用网页功能**:在Flash中,AS可以调用JavaScript函数来操作DOM,实现如弹窗、导航等网页行为。 4. **数据共享**:例如,在单页应用中,AS和JS可能需要共享用户输入的数据或应用程序状态。 在给定的文件中,...

    flex与js交互浅析.docx

    在HTML页面中,我们需要定义相应的JavaScript函数: ```html &lt;SCRIPT LANGUAGE="JavaScript"&gt; function changeDocumentTitle(a) { window.document.title = a; return "successful"; } ``` 需要注意的是,...

    flex 和 javascript 测通

    当在Flex中调用JavaScript函数时,这个调用会被转换为Flash Player的消息,然后由Player传递给宿主浏览器,再由浏览器执行相应的JavaScript代码。 4. **JavaScript到Flex的通信**:JavaScript可以通过调用...

    arcgis server FLEX调用百度地图的实现类

    在FLEX应用中,我们可以通过Flash External Interface来调用JavaScript函数,从而与百度地图API交互。 实现步骤如下: 1. **设置HTML容器**:在FLEX应用中,你需要有一个HTML面板来承载百度地图的HTML代码。使用`...

    flex与as2交互

    在Flex应用中,你可以通过`ExternalInterface.call`方法调用AS2的函数,而在AS2代码中,你可以监听`external`对象的`call`事件来响应Flex的调用。 2. **LocalConnection:** `LocalConnection`对象允许在不同的...

    Flash AS3与JAVASCRIPT通信,读取图片,生成SWC

    1. **ActionScript 3 (AS3)与JavaScript通信**: - **Bridge技术**:AS3和JavaScript之间的通信主要通过Flash Player的`ExternalInterface`类实现。`ExternalInterface.addCallback`方法用于在AS3中注册一个函数,...

    flex与ajax交互、flex与javascript交互.docx

    该技术不仅使得Flex能够直接访问浏览器环境中的JavaScript函数,还允许JavaScript调用Flex中的方法。这对于构建动态且交互性高的Web应用非常有用。此外,这种方式还简化了前端开发过程,提高了开发效率。

Global site tag (gtag.js) - Google Analytics