搜尋部落格文章

2013年5月22日 星期三

[轉] Flash 調用外部JS函數

實現這個功能需要用到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。 

 

如果容器為其它的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 對象的方法)。 也就是說,將傳遞參數並返回結果,就如同調用本地函數一樣。 

 
... 
 
... 
 
 

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

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

from: http://www.360doc.com/content/11/0413/17/1485725_109368759.shtml

2013年5月13日 星期一

無法置換Windows登入畫面之解決方法

  1. Go to Start->Run and type in regedit.
  2. Back up your registry using File->Export.
  3. In the tree on the left, navigate to the following key:
    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background
  4. Double-click on the OEMBackground key and change its value to 0.
  5. Click OK.