套件 | flash.external |
類別 | public final class ExternalInterface |
繼承 | ExternalInterface Object |
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
使用 ExternalInterface 類別,您可以在 HTML 頁面中使用 JavaScript,在 Flash 執行階段中呼叫 ActionScript 函數。ActionScript 函數可以傳回一個值,JavaScript 會立即接收做為該呼叫的傳回值。
這個功能會取代 fscommand()
方法。
您可以在下列瀏覽器與作業系統的組合中使用 ExternalInterface 類別:
瀏覽器 | 作業系統 | 作業系統 |
---|---|---|
Internet Explorer 5.0 和更新版本 | Windows | |
Netscape 8.0 和更新版本 | Windows | MacOS |
Mozilla 1.7.5 和更新版本 | Windows | MacOS |
Firefox 1.0 和更新版本 | Windows | MacOS |
Safari 1.3 和更新版本 | MacOS |
Flash Player for Linux 9.0.31.0 版和更新版本在下列瀏覽器中支援 ExternalInterface 類別:
瀏覽器 |
---|
Mozilla 1.7.x 和更新版本 |
Firefox 1.5.0.7 和更新版本 |
SeaMonkey 1.0.5 和更新版本 |
ExternalInterface 類別要求使用者的網頁瀏覽器必須支援 ActiveX® 或由某些瀏覽器所公開的 NPRuntime API 以供編寫外掛程式 Script。即使瀏覽器和作業系統的組合不在上列項目之中,但只要它們支援 NPRuntime API,應該就會支援 ExternalInterface 類別。 請參閱 http://www.mozilla.org/projects/plugins/npruntime.html。
注意:在 HTML 網頁內嵌 SWF 檔時,請確定 id
特質已設定,而且 object
的 id
和 name
特質以及 embed
標籤未包含下列字元:
. - + * / \
Flash Player 應用程式的注意事項:Flash Player 9.0.115.0 版本以及之後版本允許 .
(句點) 字元出現在 id
和 name
特質中。
Flash Player 應用程式的注意事項:在瀏覽器中執行的 Flash Player 10 和更新版本中,使用這個類別以程式設計的方式開啟彈出式視窗可能不會成功。各種瀏覽器 (和瀏覽器組態設定) 可能隨時封鎖彈出式視窗,所以無法保證彈出式視窗一定會出現。但為了確保最大的成功機會,最好只在為了回應使用者動作 (例如,按下滑鼠或按下按鍵事件的事件處理常式中) 而直接執行的程式碼中使用這個類別來開啟彈出式視窗。
透過 JavaScript,您可以在 HTML 網頁執行下列動作:
- 呼叫任何 JavaScript 函數。
- 用任何名稱來傳遞任何數目的引數。
- 傳遞不同的資料類型 (Boolean、Number、String 等等)。
- 接收來自 JavaScript 函數的傳回值。
透過 JavaScript,您可以在 HTML 網頁執行下列動作:
- 呼叫 ActionScript 函數。
- 使用標準函數呼叫標記法來傳遞引數。
- 將值傳回 JavaScript 函數。
Flash Player 應用程式的注意事項:目前 Flash Player 不支援在 HTML 表單內嵌 SWF 檔案。
AIR 應用程式注意事項:在 Adobe AIR 中,ExternalInterface 類別可以用來在 HTMLLoader 控制項中載入之 HTML 頁面的 JavaScript,與該 HTML 頁面中所內嵌 SWF 內容的 ActionScript 通訊。
更多範例
Accessing Flex from JavaScript
About ExternalInterface API security in Flex
相關 API 元素
屬性 | 定義自 | ||
---|---|---|---|
available : Boolean [靜態] [唯讀]
指出這個播放程式是否在提供外部介面的容器內。 | ExternalInterface | ||
constructor : Object
類別物件的參照或是特定物件實體的建構函數。 | Object | ||
marshallExceptions : Boolean = false [靜態]
指出外部介面是否應該嘗試傳遞 ActionScript 例外給目前瀏覽器,及傳遞 JavaScript 例外給播放程式。 | ExternalInterface | ||
objectID : String [靜態] [唯讀]
傳回 Internet Explorer 中 object 標籤的 id 特質,或 Netscape 中 embed 標籤的 name 特質。 | ExternalInterface |
方法 | 定義自 | ||
---|---|---|---|
[靜態]
將 ActionScript 方法註冊為可從容器呼叫。 | ExternalInterface | ||
[靜態]
呼叫 SWF 容器公開的函數,傳遞 0 個或更多引數。 | ExternalInterface | ||
指出物件是否有已定義的指定屬性。 | Object | ||
指出 Object 類別的實體是否位於指定為參數的物件原型鏈中。 | Object | ||
指出指定的屬性是否存在,以及是否可列舉。 | Object | ||
為迴圈作業設定動態屬性的可用性。 | Object | ||
傳回代表此物件的字串,根據地區特定慣例進行格式化。 | Object | ||
會傳回指定之物件的字串形式。 | Object | ||
會傳回指定之物件的基本值。 | Object |
available | 屬性 |
available:Boolean
[唯讀] 語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
指出這個播放程式是否在提供外部介面的容器內。 如果可使用外部介面,則此屬性為 true
;否則為 false
。
注意:將 External API 與 HTML 搭配使用時,務必確認 HTML 已經完成載入後,再嘗試呼叫任何 JavaScript 方法。
實作
public static function get available():Boolean
範例 ( 如何使用本範例 )
available
屬性來判斷播放程式是否在提供外部介面的容器內。
package { import flash.text.TextField; import flash.display.MovieClip; import flash.external.ExternalInterface; public class extint_test extends MovieClip { public function extint_test() { var isAvailable:Boolean = ExternalInterface.available; var availTxt:TextField = new TextField(); availTxt.text = isAvailable.toString(); addChild(availTxt); } } }
marshallExceptions | 屬性 |
public static var marshallExceptions:Boolean = false
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 1.0, Flash Player 9.0.115.0, Flash Lite 4 |
指出外部介面是否應該嘗試傳遞 ActionScript 例外給目前瀏覽器,及傳遞 JavaScript 例外給播放程式。您必須將這個屬性明確設定為 true
,才能在 ActionScript 中捕捉 JavaScript 例外,及在 JavaScript 中捕捉 ActionScript 例外。
相關 API 元素
範例 ( 如何使用本範例 )
addCallback()
方法向包含的瀏覽器註冊這個函數。 新函數會擲出例外,讓瀏覽器中執行的 JavaScript 程式碼可以捕捉它。 這個範例也包含 try..catch
陳述式,以捕捉瀏覽器在呼叫 throwit()
函數時擲出的任何例外。
package { import flash.external.* import flash.net.*; import flash.display.*; import flash.system.System; public class ext_test extends Sprite { function ext_test():void { ExternalInterface.marshallExceptions = true; ExternalInterface.addCallback("g", g); try { ExternalInterface.call("throwit"); } catch(e:Error) { trace(e) } } function g() { throw new Error("exception from actionscript!!!!") } } }
objectID | 屬性 |
addCallback | () | 方法 |
public static function addCallback(functionName:String, closure:Function):void
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
將 ActionScript 方法註冊為可從容器呼叫。成功叫用 addCallBack()
後,容器內的 JavaScript 或 ActiveX 程式碼就可以呼叫播放程式中的已註冊函數。
注意:對於在瀏覽器內執行的 local 內容,只有當 SWF 檔和內含的網頁位於本機信任的安全執行程序之內時,呼叫 ExternalInterface.addCallback()
方法才有作用。如需詳細資訊,請參閱「Flash Player 開發人員中心」主題:「安全性」。
參數
functionName:String — 容器叫用函數所依據的名稱。
| |
closure:Function — 要叫用的函數結束項。 這可能是獨立函數,或是參照物件實體方法的方法結束項。 藉由傳遞方法結束項,您可以將回呼導向特定物件實體的方法。
注意:在具有 |
擲回值
Error — 容器不支援連入呼叫。 只有 Windows 的 Internet Explorer 和使用 NPRuntime API 的瀏覽器 (例如 Mozilla 1.7.5 和更新版本或 Firefox 1.0 和更新版本) 支援連入呼叫。
| |
SecurityError — ActionScript 已經將具有指定名稱的回呼加入至您無法存取的執行程序中,因此您無法覆寫該回呼。 如果要解決這個問題,請重新編寫原先呼叫 addCallback() 方法的 ActionScript,讓它也呼叫 Security.allowDomain() 方法。
| |
SecurityError — 這個容納環境屬於呼叫程式碼無法存取的安全執行程序。 若要解決這個問題,請執行下列步驟:
|
相關 API 元素
call | () | 方法 |
public static function call(functionName:String, ... arguments):*
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
呼叫 SWF 容器公開的函數,傳遞 0 個或更多引數。如果無法取得想要的函數,該呼叫會傳回 null
,否則會傳回函數所提供的值。 Opera 或 Netscape 瀏覽器「不」允許遞迴。在這些瀏覽器上,遞迴呼叫會產生 null
回應 (Internet Explorer 和 Firefox 瀏覽器不支援遞迴)。
如果容器是 HTML 網頁,則此方法會叫用 script
元素中的 JavaScript 函數。
如果容器是其他 ActiveX 容器,則此方法會傳送特定名稱的 FlashCall ActiveX 事件,由容器處理該事件。
如果容器掛載著 Netscape 外掛程式,您就可以為新的 NPRuntime 介面撰寫自訂支援,或是嵌入 HTML 控制項,再將播放程式嵌入 HTML 控制項內。如果嵌入的是 HTML 控制項,您就可以原生容器應用程式的 JavaScript 介面,來與播放程式進行通訊。
注意:對於在瀏覽器內執行的 local 內容,只有當 SWF 檔和內含的網頁 (如果有) 位於本機信任的安全執行程序之內時,才允許呼叫 ExternalInterface.call()
方法。 您也可以拒絕 SWF 檔使用這個方法,方式是在包含 SWF 內容的 HTML 網頁中,設定 object
和 embed
標籤的 allowNetworking
參數。 如需詳細資訊,請參閱「Flash Player 開發人員中心」主題:「安全性」。
Flash Player 應用程式的注意事項:在 Flash Player 10 和 Flash Player 9 更新 5 中,如果啟用了彈出式視窗封鎖程式,某些網頁瀏覽器會限制這個方法。在此狀況中,只有在回應使用者事件 (例如,在按下滑鼠或按下按鍵事件的事件處理常式中) 時,才能成功呼叫這個方法。
參數
functionName:String — 要在容器中呼叫之函數的英數字元名稱。使用非英數字元的函數名稱會導致執行階段錯誤 (錯誤 2155)。您可以使用 try..catch 區塊來處理錯誤。
| |
... arguments — 要傳遞至容器中函數的引數。 您可以指定零個或多個參數 (以逗號分隔)。 它們可以是任何 ActionScript 資料類型。 呼叫 JavaScript 函數時,ActionScript 類型會自動轉換成 JavaScript 類型,呼叫其他 ActiveX 容器時,則會將參數編碼在要求訊息內。
|
* — 從容器收到的回應。 如果呼叫失敗 (例如,容器中沒有這個函數、無法取得介面、發生遞迴 (使用 Netscape 或 Opera 瀏覽器時),或者出現安全性問題),便會傳回 null ,並擲出錯誤。
|
擲回值
Error — 容器不支援外送呼叫。 只有 Windows 的 Internet Explorer 和使用 NPRuntime API 的瀏覽器 (例如 Mozilla 1.7.5 和更新版本或 Firefox 1.0 和更新版本) 支援外送呼叫。
| |
SecurityError — 這個容納環境屬於呼叫程式碼無法存取的安全執行程序。 若要解決這個問題,請執行下列步驟:
|
範例 ( 如何使用本範例 )
// // Requires: // - A Flash Professional Label component on the Stage with an instance name of "lbl". // - A Flash Professional Button component on the Stage with an instance name of "button". // var xmlResponse:String = "<invoke name=\"isReady\" returntype=\"xml\"><arguments><number>1</number><number>" + stage.stageWidth + "</number><number>" + stage.stageHeight + "</number></arguments></invoke>"; lbl.text = "ExternalInterface.available: " + ExternalInterface.available; lbl.width = 200; button.enabled = ExternalInterface.available; button.addEventListener(MouseEvent.CLICK, button_click); function button_click(evt:MouseEvent):void { ExternalInterface.call("alert", xmlResponse); }
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; import flash.system.Security; public class ExternalInterfaceExample extends Sprite { private var input:TextField; private var output:TextField; private var sendBtn:Sprite; public function ExternalInterfaceExample() { // constructor code Security.allowDomain("*"); 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"); output.appendText("ExternalInterface.objectID = " + ExternalInterface.objectID + "\n"); Timer(event.target).stop(); } } private function clickHandler(event:MouseEvent):void { if (ExternalInterface.available) { ExternalInterface.call("sendToJavaScript", input.text); } } } }
<!-- saved from url=(0014)about:internet --> <html lang="en"> <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 sendToActionScript(value) { document.getElementById("ExternalInterfaceExample").sendToActionScript(value); } function sendToJavaScript(value) { document.forms["form1"].output.value += "ActionScript says: " + value + "\n"; } </script> </head> <body onload="pageInit();"> <object id="ExternalInterfaceExample" name="ExternalInterfaceExample" type="application/x-shockwave-flash" data="ExternalInterfaceExample.swf" width="550" height="400"> <param name="movie" value="ExternalInterfaceExample.swf"/> <param name="quality" value="high"/> <param name="allowscriptaccess" value="always"/> <a href="http://www.adobe.com/go/getflash"> <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player"/> </a> </object> <form name="form1" onsubmit="return false;"> <input type="text" name="input" value="" /> <input type="button" value="Send" onclick="sendToActionScript(this.form.input.value);" /><br /> <textarea cols="60" rows="20" name="output" readonly="true">Initializing...</textarea> </form> </body> </html>
Tue Jun 12 2018, 03:47 PM Z