古詩詞大全網 - 古詩大全 - flash 調用外部JS函數

flash 調用外部JS函數

cs3裏面的實現方法:

實現這個功能需要用到as裏的externalinterface類

可以在as文檔裏找到

獲取有關外部容器的信息

ExternalInterface.available 屬性指示當前的 Flash Player 是否位於提供外部接口的容器中。如果外部接口可用,則此屬性為 true;否則,為 false。在使用 ExternalInterface 類中的任何其它功能之前,應始終進行檢查以確保當前容器支持外部接口通信,如下所示:

if (ExternalInterface.available)

{

// 在此執行 ExternalInterface 方法調用。

}

註意

ExternalInterface.available 屬性報告當前容器是否為支持 ExternalInterface 連接的容器類型。它不會報告當前瀏覽器中是否啟用了 JavaScript。

通過使用 ExternalInterface.objectID 屬性,您可以確定 Flash Player 實例的唯壹標識符(具體來說,是指 Internet Explorer 中 object 標簽的 id 屬性,或者是指使用 NPRuntime 接口的瀏覽器中 embed 標簽的 name 屬性)。這個唯壹的 ID 代表瀏覽器中的當前 SWF 文檔,並可用於對 SWF 文檔進行引用,例如:在容器 HTML 頁中調用 JavaScript 函數時進行引用。當 Flash Player 容器不是 Web 瀏覽器時,此屬性為 null。

從 ActionScript 中調用外部代碼

ExternalInterface.call() 方法執行容器應用程序中的代碼。它至少需要壹個參數,即包含容器應用程序中要調用函數的名稱的字符串。傳遞給 ExternalInterface.call() 方法的其它任何參數均作為函數調用的參數傳遞給容器。

// 調用外部函數"addNumbers"

// 傳遞兩個參數並將該函數的結果

// 賦給變量"result"

var param1:uint = 3;

var param2:uint = 7;

var result:uint = ExternalInterface.call("addNumbers", param1, param2);

如果容器為 HTML 頁,此方法將調用具有指定名稱的 JavaScript 函數,必須在包含 HTML 頁中的 script 元素中定義該函數。JavaScript 函數的返回值被傳遞回 ActionScript。

<script language="JavaScript">

// 加上兩個數字,然後將結果發送回 ActionScript

function addNumbers(num1, num2)

{

return (num1 + num2);

}

</script>

如果容器為其它的 ActiveX 容器,此方法將導致 Flash Player ActiveX 控件調度它的 FlashCall 事件。Flash Player 將指定的函數名及所有參數序列化為壹個 XML 字符串。容器可以在事件對象的 request 屬性中訪問該信息,並用它來確定如何執行它自己的代碼。為了將值返回 ActionScript,容器代碼調用 ActiveX 對象的 SetReturnValue() 方法,並將結果(序列化為壹個 XML 字符串)作為該方法的參數進行傳遞。有關該通信使用的 XML 格式的詳細信息,請參閱外部 API 的 XML 格式。

無論容器為 Web 瀏覽器還是為其它 ActiveX 容器,只要調用失敗或容器方法沒有指定返回值,都將返回 null。如果包含環境屬於調用代碼無權訪問的安全沙箱,ExternalInterface.call() 方法將引發 SecurityError 異常。可以通過在包含環境中為 allowScriptAccess 設置合適的值來解決此問題。例如,要在 HTML 頁中更改 allowScriptAccess 的值,請編輯 object 和 embed 標簽中的相應屬性。

從容器中調用 ActionScript 代碼

容器只能調用函數中的 ActionScript 代碼,而不能調用任何其它 ActionScript 代碼。要從容器應用程序調用 ActionScript 函數,必須執行兩項操作:向 ExternalInterface 類註冊函數,然後從容器的代碼調用它。

首先,必須註冊 ActionScript 函數,指示其應能夠為容器所用。使用 ExternalInterface.addCallback() 方法,如下所示:

function callMe(name:String):String

{

return "busy signal";

}

ExternalInterface.addCallback("myFunction", callMe);

addCallback() 方法采用兩個參數。第壹個參數為 String 類型的函數名,容器將籍此名稱得知要調用的函數。第二個參數為容器調用定義的函數名時要執行的實際 ActionScript 函數。由於這些名稱是截然不同的,因此可以指定將由容器使用的函數名,即使實際的 ActionScript 函數具有不同的名稱。這在函數名未知的情況下特別有用,例如:指定了匿名函數或需要在運行時確定要調用的函數。

壹旦向 ExternalInterface 類註冊了 ActionScript 函數,容器就可以實際調用該函數。完成該操作的具體方法依容器的類型而定。例如,在 Web 瀏覽器的 JavaScript 代碼中,使用已註冊的函數名調用 ActionScript 函數,就像它是 Flash Player 瀏覽器對象的方法(即,壹個表示 object 或 embed 標簽的 JavaScript 對象的方法)。也就是說,將傳遞參數並返回結果,就如同調用本地函數壹樣。

<script language="JavaScript">

// callResult gets the value "busy signal"

var callResult = flashObject.myFunction("my name");

</script>

...

<object id="flashObject"...>

...

<embed name="flashObject".../>

</object>

或者,在運行於臺式機應用程序中的 SWF 文件中調用 ActionScript 函數時,必須將已註冊的函數名及所有參數序列化為壹個 XML 格式的字符串。然後,將該 XML 字符串作為壹個參數來調用 ActiveX 控件的 CallFunction() 方法,以實際執行該調用。有關該通信使用的 XML 格式的詳細信息,請參閱外部 API 的 XML 格式。

不管是哪種情況,ActionScript 函數的返回值都被傳遞回容器代碼,當調用方為瀏覽器中的 JavaScript 代碼時直接作為值返回,而當調用方為 ActiveX 容器時則會序列化為 XML 格式字符串。