Flex与Javascript之间的交互

      最近做的一个项目要用到Flex与Javascrip之间的交互,所以花时间学习了一下。在

网上找了好多关于这方面的文章,但是介绍的都不是很全面,主要是例子程序写的不是很

好,很多都还存在一些问题,download下来后,发现还要做些修改才能运行。

      先分别简要介绍一下Flex调用Javascript函数和Javascript调用Flex函数。

      1. Flex调用Javascript函数

      Flex通过使用ExternalInterface.call()函数来调用Javascript中的方法,此函数的原型为

ExternalInterface.call(function_name:String, parameter:String),参数function_name

是调用的javascript的函数名,parameter是Javacript函数需要的参数。此函数还可以有返回值

,也就是说Javascript函数可以返回一个结果给ExternalInterface.call()这个函数调用.ExternalInterface

封装了对浏览器支持的检查,可以用available属性来查看。

      先举个简单的例子:

      Javascript函数:

      function sayHelloFromJs(message)

      {

              alert(message);  //message是由flex端传过来的

              return "echo from javascript:" + message; //返回给Flex端的消息

       }

      Flex调用:

      var str:String = ExternalInterface.call("sayHelloFromJs","Hello,Javascript.");

      Alert.show(str); //显示javascript端返回的消息

 

      2. Javascript调用Flex函数:

       Flex端需要注册和页面交互的Javascript方法。通过ExternalInterface的addCallback()函数实现,

addCallback()函数的原型为addCallback(js_function:String, flex_function:Function),第一个参数

js_function是Javascript可以调用的方法名称,第二个参数flex_function是Javascript回调的Flex方法.

      举个简单的例子:

      Flex端:

      public function sayHelloFromFlex(message:String):String

     {

           Alert.show(message); //Javascript端传过来的消息

           var str:String = "echo from flex:" + message;

           return str; //返回给Flex端的消息

     }

     public function initApp()

     {

            ExternalInterface.addCallback("sayHelloFromFlex",sayHelloFromFlex);//注册与页面交互的方法

     }

     Javascript端:

     在javascript端首先要获取swf对象的引用,我们假设我们已经拿到了该引用,为MyFlexApp.

swf的获取将在下面专门介绍。

     <script language = 'Javacript' charset = 'uft-8'>

     function testFlexFunc()

     {

           var strMessage = MyFlexApp.sayHelloFromFlex("Hello, Flex");

           alert(strMessage); 

     }

    </script>

    <button οnclick="testFlexFunc()"> TestFlexFunc</button>

   

      3.  Javascript端获取swf对象的引用:

      在Javascript代码中,我们首先要定义一个object标签对象,object标签对象的大概格式

如下:

<object type='application/x-shockwave-flash'
 data='FlexAndJs.swf' width='600' height='480'
 name='test' id='MyFlexApps'>

 <param name='allowScriptAccess' value='always' />
 <param name='movie' value='FlexAndJs.swf' />
 <param name='quality' value='high' />
 <param name='scale' value='noScale' />
 <param name='wmode' value='transparent' />

<embed src="FlexObject.swf" width="640" height="378"
   name ="FlexObject"
   play="true"
   loop="false"
   allowScriptAccess="sameDomain"
   type="application/x-shockwave-flash"
   pluginspage="http://www.adobe.com/go/getflashplayer">
</embed>

</object>

   定义好这个节点标签后,我们还需要在写一个JS函数来获取该swf对象的引用。

function getSWFObject(movieName)

{

   if(document[movieName])
   {
         return document[movieName];
   }else if(window[movieName]){
        return window[movieName]; 
   }else if(document.embeds && document.embeds[movieName]){
        return document.embeds[movieName];
   }else{
        return document.getElementById(movieName);
   }

}

   然后上面2中的testFlexFunc()函数的那条调用Flex函数的语句可以改写为:

var strMessage = getSWFObject["MyFlexApps"].sayHelloFromFlex("Hello, Flex");

 

最后给出一个完整的例子供大家参考,包括Flex端和JS端的完整代码:

Flex代码:

 <?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()"
layout="absolute" width="200" height="160">
<mx:Script>
 <![CDATA[
  import mx.controls.Alert;
  public function sayHelloFromFlex(message:String):String{
   Alert.show(message);
   var str:String = "Echo from Flex: "+ message;
   return str;
  }
  public function initApp():void {
   Security.allowDomain("*");
   Security.allowInsecureDomain("*");
   ExternalInterface.addCallback("sayHelloFromFlex",sayHelloFromFlex);
  }
  public function invokeJsFunc():void {
   var str:String = ExternalInterface.call("sayHelloFromJs","Hello,Javascript.");
   Alert.show(str);
  }     
 ]]>
</mx:Script>
<mx:Button x="39" y="68" label="Invoke JS Function" click="invokeJsFunc()"/>
</mx:Application>

Html代码:

<html>
  <head> </head>
  <body scroll="no">
  <script>
  function sayHelloFromJs(value){
        alert(value);
        return "Echo from Js: " + value;
    }
 
  function invokeFlexFunc(){
        var message = "Hello,Flex.";
        var str = getSWFObject("MyFlexApps").sayHelloFromFlex(message);
        alert(str);
    }
  function getSWFObject(movieName)
  {
   if(document[movieName])
   {
    return document[movieName];
   }else if(window[movieName]){
    return window[movieName]; 
   }else if(document.embeds && document.embeds[movieName]){
    return document.embeds[movieName];
   }else{
    return document.getElementById(movieName);
   }
  }
</script>
  <object type='application/x-shockwave-flash'
 data='FlexAndJs.swf' width='200' height='160'
 name='test' id='MyFlexApps'>
 <param name='allowScriptAccess' value='always' />
 <param name='movie' value='FlexAndJs.swf' />
 <param name='quality' value='high' />
 <param name='scale' value='noScale' />
 <param name='wmode' value='transparent' />
  </object>
  <input type="button" value="InvokeFlexFunction" οnclick="invokeFlexFunc()"/>
  </body>
</html>

     

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值