有时候Flex需要与外部容器交互,比如和别的项目交互,调用外部数据,则可以通过ExternalInterface来实现。毕竟Flex版本还是比较“年轻”,有些地方还不完美,需要借助外部力量去实现。
ExternalInterface类是外部 API,这是一个在 ActionScript 和 Flash Player 容器之间实现直接通信的应用程序编程接口,例如,包含 JavaScript 的 HTML 页。Adobe 建议使用 ExternalInterface 实现 JavaScript 与 ActionScript 之间的所有通信。这个类主要有两个方法:
●addCallback(functionName:String,closure:Function):void 将ActionScript 方法注册为可从容器调用。成功调用addCallBack()
后,容器中的 JavaScript 或 ActiveX 代码可以调用在 Flash Player 中注册的函数。
●call(functionName:String,...arguments):* 调用由 Flash Player 容器公开的函数,不传递参数或传递多个参数。如果该函数不可用,调用将返回null
;否则,它返回由该函数提供的值
具体用法可以查阅Flex4API,里面讲的很详细。
本人今天做了一个Flex与外部交互的小例子,做了之后对ExternalInterface有了更深的认识。
新建一个mxml页面ExternalInterfaceDemo.mxml,代码如下所示:
<?xml version="1.0"encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="app_creationCompleteHandler(event)"> <fx:Script> <![CDATA[ import mx.controls.Alert; import mx.events.FlexEvent; protected function app_creationCompleteHandler(event:FlexEvent):void { // TODOAuto-generated method stub ExternalInterface.addCallback("sendData",sendDataSelectHandler); getData.addEventListener(MouseEvent.CLICK,mouseClickHandler); } private function mouseClickHandler(event:MouseEvent):void{ ExternalInterface.call("getData"); } private function sendDataSelectHandler(obj:Object):void{ var name:String=obj['username']; var pass:String=obj['passworld']; username.text=name; passworld.text=pass; } ]]> </fx:Script> <fx:Declarations> <!-- Place non-visualelements (e.g., services, value objects) here --> </fx:Declarations> <s:Panel x="205" y="116" width="574" height="324"> <s:Button id="getData" x="261" y="196" width="134" height="42" fontSize="16" label="获取外部数据"/> <s:Label x="179" y="92" width="71" fontSize="19" text="姓名:"/> <s:TextInput x="254" y="92" id="username" fontSize="16" editable="false"/> <s:Label x="179" y="145" fontSize="18" text="密码:"/> <s:TextInput x="256" y="137" id="passworld" fontSize="16" editable="false"/> </s:Panel> </s:Application>
运行后页面如下所示:
接着需要新建一个JavaScript文件用于Flex与Jsp通信的桥梁。可是如果我们直接将JavaScript代码写在自动生成的ExternalInterfaceDemo.Html中的话,当我们再次修改ExternalInterfaceDemo.mxml文件后自动生成的ExternalInterfaceDemo.Html将覆盖原有的代码,这样我们的努力都会功亏与溃,那么怎么办?
查资料我才发现,每个自动生成的html页面都是由html-template目录下的index.template.html模板页生成,如果我们在此页面中添加一个JavaScript引入文件,那么所有的页面都会自动引入此JavaScript文件。问题就此解决了。
新建一个用于向Flex传送数据的Jsp文件externalInterfaceJsp.jsp,代码如下所示:
<%@ page language="java"contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type"content="text/html; charset=ISO-8859-1"> <title>测试</title> <script type="text/javascript"src="../page/swf/commonJS.js"></script> //引用创建的JavaScript文件 <style type="text/css"> table.demo{border-collapse: collapse;margin-left:50px;margin-top:10px;} table.demo th,td {padding: 0; border: 1px solid #000;} </style> </head> <body> <form > <table class="demo" width="400px"height="150px" id="registerTable"> <thead> <tr style="height:10px;" > <th colspan="2" align="center">注册表</th> </tr> </thead> <tbody> <tr> <td style="text-align: right;">姓名:</td> <td><input id="username"type="text"> </td> </tr> <tr> <td style="text-align: right;">密码:</td> <td><input id="passworld"type="password" ></td> </tr> <tr > <th colspan="2" align="center"> <input type="button" value="提交" onClick="submitData()"></th> </tr> </tbody> </table> </form> </body> </html>
运行效果如下所示:
接下来新建一个JavaScript文件commonJS.js,我是在输出目录下新建的一个JavaScript文件:
/** * Flex与Jsp交互 */ function getData() { var url="../../jsp/externalInterfaceJsp.jsp"; window.open(url,"", "height=200,width=500,status=no,resizable=yes,location=no,left=95,top=110,scroll=no,help=no"); //打开一个新窗口 } function submitData(){ try{ var username=document.getElementById("username").value; var passworld=document.getElementById("passworld").value; var obj=new Object(); obj.username=username; obj.passworld=passworld; var ExternalInterfaceDemo=window.parent.opener.document.getElementById('ExternalInterfaceDemo'); //获得一个ExternalInterfaceDemo实例 ExternalInterfaceDemo.sendData(obj); //调用ActionScript中的方法 window.close(); //关闭此子窗口 }catch(e){ alert(e); } }
好了,开始交互,当我们在externalInterfaceJsp.jsp中输入数值后,此页面的数据就会自动带回到Flex页面。如果你实现了就说明你成功了。
原创文章,转载请注明出处:http://www.dianfusoft.com/