早就再留意Flex與Js的互動方式了,網上看了就三兩句代碼就解決了,從前對此比較不屑,自認為什麼時 候想用了花個5分鐘看看就搞定了。
今天終於靜下來自己測試和整理了下,才發現其實要調試成功並沒那麼簡單,這幾行代碼折騰了我大半天 真是的。
下面我把我的測試代碼和心得和大家分享下:
Js2Flex.mxml
view plaincopy to clipboardprint?
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="initApp()">
- <mx:Script>
- <!--[CDATA[
- import mx.controls.Alert;
-
- public function flexHelloWorld(param1:String, param2:String):String {
- Alert.show("param1: " + param1 + "; param2:" + param2);
- return "Hello " + param1 + param2;
- }
-
- public function initApp():void {
- ExternalInterface.addCallback("flexHelloWorld", flexHelloWorld);
- }
-
- public function jspHello():void {
- var s:String = ExternalInterface.call("hello", "Flex");
- Alert.show(s);
- }
- ]]-->
- </mx:Script>
- <mx:Button x="52" y="58" label="call javascript" click="jspHello()"/>
- </mx:Application>
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="initApp()"> <mx:Script> <!--[CDATA[ import mx.controls.Alert; public function flexHelloWorld(param1:String, param2:String):String { Alert.show("param1: " + param1 + "; param2:" + param2); return "Hello " + param1 + param2; } public function initApp():void { ExternalInterface.addCallback("flexHelloWorld", flexHelloWorld); } public function jspHello():void { var s:String = ExternalInterface.call("hello", "Flex"); Alert.show(s); } ]]--> </mx:Script> <mx:Button x="52" y="58" label="call javascript" click="jspHello()"/> </mx:Application>
testSwf.html
view plaincopy to clipboardprint?
- <html>
- <head>
- <mce:script type="text/javascript" src="swfobject.js" mce_src="swfobject.js"></mce:script>
- </head>
- <body>
- <div id="flashcontent">
- This text is replaced by the Flash movie.
- </div>
- <br>
- <input type=button value="Call Flex" onclick="callflex()"/>
- <mce:script language="javascript"><!--
- var so = new SWFObject("Js2Flex.swf", "flexObject", "640", "300", "7", "#336699");
- so.write("flashcontent");
- function hello(param) {
- return "jsp Hello:" + param;
- }
-
- function callFlexFunction() {
- var fl = document.getElementById("flexObject");
- var x= fl.flexHelloWorld("Hello", "world");
- }
- function callflex()
- {
- callFlexFunction();
- }
- // --></mce:script>
- </body>
- </html>
<html> <head> <mce:script type="text/javascript" src="swfobject.js" mce_src="swfobject.js"></mce:script> </head> <body> <div id="flashcontent"> This text is replaced by the Flash movie. </div> <br> <input type=button value="Call Flex" onclick="callflex()"/> <mce:script language="javascript"><!-- var so = new SWFObject("Js2Flex.swf", "flexObject", "640", "300", "7", "#336699"); so.write("flashcontent"); function hello(param) { return "jsp Hello:" + param; } function callFlexFunction() { var fl = document.getElementById("flexObject"); var x= fl.flexHelloWorld("Hello", "world"); } function callflex() { callFlexFunction(); } // --></mce:script> </body> </html>
其實互動主要是通過 Flex內建介面ExternalInterface的addCallback和call方法來實現的,一個是命名方法代理,一個是條用Js方法。然後通 過swfobject.js內建的方法嵌入swf實現Flex和JavaScript的無縫互動
注意:一定要到網上下載swfobject.js,然後再<head>內匯入,然後用new SWFObject()嵌入swf,用<html>的<object><embed>嵌入的swf無法傳遞參數,這 個就是為什麼我弄了大半天沒調試成功的原因,這個原因還沒弄明白,不過swf還是盡量用js來嵌入,這樣更符合html標準。
還有就是如果把產生的swf更換目錄 然後本地調試會有安全沙箱問題,所以最好在伺服器上調試。