天天看點

js 調用flash 接口函數

ExternalInterfaceExample.as

以下示例示範了在 Flash Player 與 HTML 容器之間發送資料的過程。

package {

    import flash.display.Sprite;

    import flash.events.*;

    import flash.external.ExternalInterface;

    import flash.text.TextField;

    import flash.utils.Timer;

    import flash.text.TextFieldType;

    import flash.text.TextFieldAutoSize;



    public class ExternalInterfaceExample extends Sprite {

        private var input:TextField;

        private var output:TextField;

        private var sendBtn:Sprite;



        public function ExternalInterfaceExample() {

            input = new TextField();

            input.type = TextFieldType.INPUT;

            input.background = true;

            input.border = true;

            input.width = 350;

            input.height = 18;

            addChild(input);



            sendBtn = new Sprite();

            sendBtn.mouseEnabled = true;

            sendBtn.x = input.width + 10;

            sendBtn.graphics.beginFill(0xCCCCCC);

            sendBtn.graphics.drawRoundRect(0, 0, 80, 18, 10, 10);

            sendBtn.graphics.endFill();

            sendBtn.addEventListener(MouseEvent.CLICK, clickHandler);

            addChild(sendBtn);



            output = new TextField();

            output.y = 25;

            output.width = 450;

            output.height = 325;

            output.multiline = true;

            output.wordWrap = true;

            output.border = true;

            output.text = "Initializing.../n";

            addChild(output);



            if (ExternalInterface.available) {

                try {

                    output.appendText("Adding callback.../n");

                    ExternalInterface.addCallback("sendToActionScript", receivedFromJavaScript);

                    if (checkJavaScriptReady()) {

                        output.appendText("JavaScript is ready./n");

                    } else {

                        output.appendText("JavaScript is not ready, creating timer./n");

                        var readyTimer:Timer = new Timer(100, 0);

                        readyTimer.addEventListener(TimerEvent.TIMER, timerHandler);

                        readyTimer.start();

                    }

                } catch (error:SecurityError) {

                    output.appendText("A SecurityError occurred: " + error.message + "/n");

                } catch (error:Error) {

                    output.appendText("An Error occurred: " + error.message + "/n");

                }

            } else {

                output.appendText("External interface is not available for this container.");

            }

        }

        private function receivedFromJavaScript(value:String):void {

            output.appendText("JavaScript says: " + value + "/n");

        }

        private function checkJavaScriptReady():Boolean {

            var isReady:Boolean = ExternalInterface.call("isReady");

            return isReady;

        }

        private function timerHandler(event:TimerEvent):void {

            output.appendText("Checking JavaScript status.../n");

            var isReady:Boolean = checkJavaScriptReady();

            if (isReady) {

                output.appendText("JavaScript is ready./n");

                Timer(event.target).stop();

            }

        }

        private function clickHandler(event:MouseEvent):void {

            if (ExternalInterface.available) {

                ExternalInterface.call("sendToJavaScript", input.text);

            }

        }

    }

}



      

為了測試前面的 ActionScript 代碼,請使用以下 HTML 模闆嵌入生成的 SWF 檔案:

<!-- saved from url=(0014)about:internet -->

 <html >

 <head>

 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

 <title>ExternalInterfaceExample</title>

 <script language="JavaScript">

     var jsReady = false;

     function isReady() {

         return jsReady;

     }

     function pageInit() {

         jsReady = true;

         document.forms["form1"].output.value += "/n" + "JavaScript is ready./n";

     }

     function thisMovie(movieName) {

         if (navigator.appName.indexOf("Microsoft") != -1) {

             return window[movieName];

         } else {

             return document[movieName];

         }

     }

     function sendToActionScript(value) {

         thisMovie("ExternalInterfaceExample").sendToActionScript(value);

     }

     function sendToJavaScript(value) {

         document.forms["form1"].output.value += "ActionScript says: " + value + "/n";

     }

 </script>

 </head>

 <body οnlοad="pageInit();">

 

     <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"

             id="ExternalInterfaceExample" width="500" height="375"

             codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">

         <param name="movie" value="ExternalInterfaceExample.swf" />

         <param name="quality" value="high" />

         <param name="bgcolor" value="#869ca7" />

         <param name="allowScriptAccess" value="sameDomain" />

         <embed src="ExternalInterfaceExample.swf" quality="high" bgcolor="#869ca7"

             width="500" height="375" name="ExternalInterfaceExample" align="middle"

             play="true" loop="false" quality="high" allowScriptAccess="sameDomain"

             type="application/x-shockwave-flash"

             pluginspage="http://www.macromedia.com/go/getflashplayer">

         </embed>

     </object>

 

     <form name="form1" οnsubmit="return false;">

         <input type="text" name="input" value="" />

         <input type="button" value="Send" οnclick="sendToActionScript(this.form.input.value);" /><br />

         <textarea cols="60" rows="20" name="output" readonly="true">Initializing...</textarea>

     </form>

 

 </body>

 </html>



      

SecurityError

— 包含環境屬于調用代碼無權通路的安全沙箱。 若要解決此問題,請按照下列步驟操作:
  1. 在包含 SWF 檔案的 HTML 頁中,在該檔案的

    object

    标簽中設定以下參數:

    <param name="allowScriptAccess" value="always" />

  2. 在 SWF 檔案中,添加以下 ActionScript:

    flash.system.Security.allowDomain(sourceDomain )

繼續閱讀