as 代码:
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:viewer="com.esri.viewer.*" xmlns:managers="com.esri.viewer.managers.*" pageTitle="ArcGIS Viewer for Flex" creationComplete="init()"> <fx:Script> <![CDATA[ import flash.external.ExternalInterface; ① import mx.controls.Alert; import flash.external.*; import com.esri.viewer.AppEvent; private function init():void {② ExternalInterface.addCallback("test",test); ExternalInterface.addCallback("flexFunction1",jsCallBack1); ExternalInterface.addCallback("flexFunction2",jsCallBack2); } public function test():void {//无参方法 Alert.show(" js调用Flex成功!"); } private function jsCallBack1(params:*):void {//参数传递方法 Alert.show("Call Method:" + String(params)); } private function jsCallBack2():void { //根据Widgetid 打开Widget的方法 ViewerContainer.dispatchEvent(new AppEvent(AppEvent.WIDGET_RUN, 4)); } ]]> </fx:Script>
js代码:
<body οnlοad="init()">③ <script language="JavaScript" type="text/javascript"> function test() {④ getSWF("index").test(); getSWF("index").flexFunction1("myHtmlRequest!"); getSWF("index").flexFunction2(); } function getSWF(movieName) { if (navigator.appName.indexOf("Microsoft") != -1) { return window[movieName]; } else { return document[movieName]; } } </script> …………………… <input type="button" value="DoFlexFunction" onClick="test()"/> <noscript> <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%" id="index"> <param name="movie" value="index.swf" /> <param name="quality" value="high" /> <param name="bgcolor" value="#ffffff" /> <param name="allowScriptAccess" value="sameDomain" /> <param name="allowFullScreen" value="true" /> <!--[if !IE]>--> <object type="application/x-shockwave-flash" data="index.swf" width="100%" height="100%"> <param name="quality" value="high" /> <param name="bgcolor" value="#ffffff" /> <param name="allowScriptAccess" value="sameDomain" /> <param name="allowFullScreen" value="true" /> <embed src="index.swf" quality="high" bgcolor="#ffffff"⑤ width="400" height="230" name="index" align="middle" play="true" loop="false" quality="high" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer"> </embed> </object> </noscript> </body>
① ExternalInterface是flash ActionScrtip提供的外部访问接口,所以首先需要导入包 (import flash.external.ExternalInterface;);
② 将 ActionScript 方法注册为可从容器里调用,成功调用 addCallBack() 后 (ExternalInterface.addCallback("用于Js调用的函数名",As中的函数名)),容器中的 JavaScript代码可以调用在 Flash Player 中注册的函数;
③ AS调用的加载方法;
④ 此代码依赖 object 标签的 id 属性和 embed 标签的 name 属性以获得注册函数 的响应。由于 Internet Explorer 和 Netscape 以不同方式引用 movie 对象,所以函数 thisMovie 根据浏览器返回相应的语法。除非服务器上承载 HTML 页,否则浏览器可能会出现安全警告。(注意:请避免使用其它访问插件对象的方法,例document.getElementById("pluginName") 或 document.all.pluginName,因为这些其它方法不能在所有浏览器中一致地工作。js中可以用document.getElementById("Flas在Html中的ID").注册时设置的函数名(参数)进行调用)
⑤ 在HTML中我用<embed></embed>引用了SWF