var swf : SWFLoader = new SWFLoader();
swf.source="test.swf";
如果loader進來的SWF檔案用至RemoteObject,隻load一個進來是沒有問題的,但如果再load一個進來就提示錯誤:
TypeError: Error #1034: 強制轉換類型失敗:無法将 mx.messaging.messages::[email protected] 轉換為 mx.messaging.messages.ErrorMessage。
解決方法:
var swf : SWFLoader = new SWFLoader();
var lc : LoaderContext = new LoaderContext();
lc.applicationDomain = ApplicationDomain.currentDomain;
swf.loaderContext = lc;
swf.source="test.swf";
要指定SWFloader的loaderContext.loaderContext的說明如下:
包 | flash.system |
類 | public class LoaderContext |
繼承 | LoaderContext ![]() |
子類 | JPEGLoaderContext |
語言版本: | ActionScript 3.0 |
運作時版本: | AIR 1.0 Flash Player 9 |
LoaderContext 類提供多種選項,以使用 Loader 類來加載 SWF 檔案和其它媒體。LoaderContext 類用作 Loader 類的
load()
和
loadBytes()
方法的
context
參數。
使用
Loader.load()
方法加載 SWF 檔案時,需要做出兩個決定:應将所加載的 SWF 檔案放置到哪個安全域中,以及應放置到該安全域中的哪個應用程式域中? 有關這些選擇的更多詳細資訊,請參閱
applicationDomain
和
securityDomain
屬性。
使用
Loader.loadBytes()
方法加載 SWF 檔案時,與使用
Loader.load()
時一樣,也要選擇應用程式域,但不必指定安全域,這是因為
Loader.loadBytes()
始終将其加載的 SWF 檔案放置到執行加載的 SWF 檔案的安全域。
如果是加載圖像(JPEG、GIF 或 PNG)而不是 SWF 檔案,則無需指定安全域或應用程式域,這是因為這些概念隻對 SWF 有意義。此時您隻需做出一個決定:是否需要以程式設計方式通路所加載圖像的像素? 如果需要,請參閱
checkPolicyFile
屬性。如果要在加載圖像時應用解塊,請使用 JPEGLoaderContext 類替代 LoaderContext 類。
公共屬性
隐藏繼承的公共屬性
顯示繼承的公共屬性
屬性 | 定義方 | |
---|---|---|
| LoaderContext | |
applicationDomain : ApplicationDomain = null 指定用于 Loader.load() 或 Loader.loadBytes() 方法的應用程式域。 | LoaderContext | |
checkPolicyFile : Boolean = false 指定在開始加載對象本身之前,應用程式是否應該嘗試從所加載對象的伺服器下載下傳 URL 政策檔案。 | LoaderContext | |
| constructor : Object 對類對象或給定對象執行個體的構造函數的引用。 | Object |
| prototype : Object [靜态] 對類或函數對象的原型對象的引用。 | Object |
securityDomain : SecurityDomain = null 指定用于 Loader.load() 操作的安全域。 | LoaderContext |
公共方法
隐藏繼承的公共方法
顯示繼承的公共方法
方法 | 定義方 | |
---|---|---|
LoaderContext (checkPolicyFile: Boolean = false, applicationDomain: ApplicationDomain = null, securityDomain: SecurityDomain = null) 建立帶有指定設定的新 LoaderContext 對象。 | LoaderContext | |
| hasOwnProperty (name: String ): Boolean 訓示對象是否已經定義了指定的屬性。 | Object |
| isPrototypeOf (theClass: Object ): Boolean 訓示 Object 類的執行個體是否在指定為參數的對象的原型鍊中。 | Object |
| propertyIsEnumerable (name: String ): Boolean 訓示指定的屬性是否存在、是否可枚舉。 | Object |
| setPropertyIsEnumerable (name: String , isEnum: Boolean = true): void 設定循環操作動态屬性的可用性。 | Object |
| toString (): String 傳回指定對象的字元串表示形式。 | Object |
| valueOf (): Object 傳回指定對象的原始值。 | Object |
屬性詳細資訊
| 屬性 |
public var allowLoadBytesCodeExecution:Boolean = false
運作時版本: | AIR 1.0 |
指定是否可以使用 Loader 對象的
loadBytes()
方法下載下傳具有可執行代碼的内容,如 SWF 檔案。在此屬性設定為
false
(預設值)的情況下,
loadBytes()
方法僅限于執行安全操作,如加載圖像。
在位于應用程式安全沙箱的 AIR 内容中,預設值為
false
。在非應用程式内容中,預設值為
true
。
注意: 在未來的 AIR 版本中,很可能會替換此 API。發生這種情況時,将需要調整代碼以使用新的 API,并在針對新版本的 AIR 釋出應用程式之前進行重新編譯。
applicationDomain | 屬性 |
public var applicationDomain:ApplicationDomain = null
語言版本: | ActionScript 3.0 |
運作時版本: | AIR 1.0 Flash Player 9 |
指定用于
Loader.load()
或
Loader.loadBytes()
方法的應用程式域。隻應在加載使用 ActionScript 3.0 編寫的 SWF 檔案(不是圖像或使用 ActionScript 1.0 或 ActionScript 2.0 編寫的 SWF 檔案)時才使用此屬性。
每 個安全域被分成一個或多個由 ApplicationDomain 對象表示的應用程式域。應用程式域并不是用于安全目的;它們用于管理 ActionScript 代碼的協作單元。如果是從其它域加載 SWF 檔案,并允許将它放置到另外一個安全域中,則您将無法控制所加載的 SWF 檔案被放置到哪個應用程式域中;即使您指定應選擇某個應用程式域,也會忽略。但是,如果是将 SWF 檔案加載到您自己的安全域中(因為此 SWF 檔案來自您自己的域,或者您正在将它導入到您的安全域中),您就可以控制為所加載的 SWF 檔案選擇哪個應用程式域。
在
LoaderContext.applicationDomain
中,您隻可以傳遞您自己的安全域中的應用程式域。如果試圖傳遞任何其它安全域中的應用程式域,則會引發
SecurityError
異常。
有四種
ApplicationDomain
屬性可供您選擇使用:
- 加載器的 ApplicationDomain 的子級。 預設值。可以使用文法
顯式表示這種選擇。這将允許所加載的 SWF 檔案直接使用父級的類,例如,可通過編寫new ApplicationDomain(ApplicationDomain.currentDomain)
來使用。但是父級則不能使用此文法;如果父級要使用子級的類,它必須調用new MyClassDefinedInParent()
來檢索它們。這種選擇的優點是,如果子級定義的類與父級已經定義的類同名,不會出現錯誤結果;子級隻會繼承父級對該類的定義,除非子級或父級調用ApplicationDomain.getDefinition()
方法來檢索子級的沖突定義,否則将不使用此定義。ApplicationDomain.getDefinition()
- 加載器自己的 ApplicationDomain。 使用
時請使用此應用程式域。加載完成後,父級和子級可以直接使用對方的類。如果子級試圖定義的類與父級已定義的類同名,則使用父類并忽略子類。ApplicationDomain.currentDomain
- 系統 ApplicationDomain 的子級。 使用
時請使用此應用程式域。這将完全分離加載方和被加載方,進而允許它們使用相同的名稱定義各自版本的類并且不會産生沖突或隐藏。一方檢視另一方的類的唯一方式是調用new ApplicationDomain(null)
方法。ApplicationDomain.getDefinition()
- 其它 ApplicationDomain 的子級。 有時可能會有更複雜的 ApplicationDomain 層次結構。可以将 SWF 檔案從您自己的 SecurityDomain 加載到任何 ApplicationDomain 中。例如,
将 SWF 檔案加載到目前域父級的父級的新子級中。new ApplicationDomain(ApplicationDomain.currentDomain.parentDomain.parentDomain)
加載完成後,為調用
ApplicationDomain.getDefinition()
,任一方(加載方或被加載方)都可能需要找到它自己的 ApplicationDomain 或另一方的 ApplicationDomain。任一方都可以通過使用
ApplicationDomain.currentDomain
來檢索對它自己的應用程式域的引用。執行加載的 SWF 檔案可以通過
Loader.contentLoaderInfo.applicationDomain
來檢索對被加載的 SWF 檔案的 ApplicationDomain 的引用。如果被加載的 SWF 檔案知道自己的加載方式,則它可以找到執行加載的 SWF 檔案的 ApplicationDomain 對象。例如,如果子級是以預設方式被加載的,則它可以通過使用
ApplicationDomain.currentDomain.parentDomain
找到執行加載的 SWF 檔案的應用程式域。
有關詳細資訊,請參閱《ActionScript 3.0 程式設計》 中“用戶端系統環境”一章的“ApplicationDomain 類”一節。
checkPolicyFile | 屬性 |
public var checkPolicyFile:Boolean = false
語言版本: | ActionScript 3.0 |
運作時版本: | AIR 1.0 Flash Player 9 |
指定在開始加載對象本身之前,應用程式是否應該嘗試從所加載對象的伺服器下載下傳 URL 政策檔案。此标志适用于
Loader.load()
方法,但不适用于
Loader.loadBytes()
方法。
如果您從執行調用的 SWF 檔案所在的域之外加載圖像(JPEG、GIF 或 PNG),并且您預計将需要從 ActionScript 通路該圖像的内容,請将此标志設定為
true
。通路圖像内容的示例包括引用
Loader.content
屬性以獲得 Bitmap 對象,以及調用
BitmapData.draw()
方法以獲得所加載圖像像素的副本。如果您在加載時沒有指定
checkPolicyFile
就嘗試執行這些操作之一,您可能會得到一個
SecurityError
異常,這是因為尚未下載下傳所需的政策檔案。
在
LoaderContext.checkPolicyFile
設定為
true
的情況下調用
Loader.load()
方法時,應用程式直到成功下載下傳了相關的 URL 政策檔案或發現不存在此類政策檔案時才開始下載下傳
URLRequest.url
中的指定對象。Flash Player 或 AIR 首先考慮已經下載下傳的政策檔案,然後嘗試下載下傳調用
Security.loadPolicyFile()
方法過程中指定的任何待下載下傳政策檔案,然後嘗試從與
URLRequest.url
對應的預設位置(即
URLRequest.url
所在伺服器上的
/crossdomain.xml
)下載下傳政策檔案。在所有情況下,給定的政策檔案必須位于
URLRequest.url
(根據政策檔案的位置而定),且政策檔案必須通過一個或多個
<allow-access-from>
标簽允許進行通路。
如果将
checkPolicyFile
設定為
true
,則
Loader.load()
方法中指定的主下載下傳将在完全處理該政策檔案之後開始下載下傳。是以,隻要您需要的政策檔案存在,一旦您收到來自 Loader 對象的
contentLoaderInfo
屬性的任何
ProgressEvent.PROGRESS
或
Event.COMPLETE
事件,就說明該政策檔案下載下傳已完成,您就可以安全地開始執行需要該政策檔案的操作。
如果您将
checkPolicyFile
設定為
true
,并且未找到相關的政策檔案,則除非您嘗試執行的操作引發了
SecurityError
異常,否則您将不會收到任何錯誤訓示。但是,一旦 LoaderInfo 對象排程
ProgressEvent.PROGRESS
或
Event.COMPLETE
事件,您就可以通過檢查
LoaderInfo.childAllowsParent
屬性的值來測試是否找到了相關的政策檔案。
如果不需要對正在加載的圖像進行像素級的通路,則不應将
checkPolicyFile
屬性設定為
true
。在這種情況下不必再檢查是否存在政策檔案,因為這樣會延遲下載下傳的開始時間,并且可能會不必要地占用網絡帶寬。
如果是使用
Loader.load()
方法下載下傳 SWF 檔案,也盡量不要将
checkPolicyFile
設定為
true
。這是因為 SWF 到 SWF 的權限不是由政策檔案控制的,而是由
Security.allowDomain()
方法控制的,是以在加載 SWF 檔案時
checkPolicyFile
不起任何作用。在這種情況下不必再檢查是否存在政策檔案,因為這樣會延遲 SWF 檔案的下載下傳,并且可能會不必要地占用網絡帶寬 (Flash Player 或 AIR 無法判斷主下載下傳将是 SWF 檔案還是圖像,這是因為政策檔案下載下傳先于主下載下傳進行。)
如果是從可能使用伺服器端 HTTP 重定向的 URL 下載下傳對象,則使用
checkPolicyFile
時要小心。始終從
URLRequest.url
中指定的相應初始 URL 檢索政策檔案。如果由于 HTTP 重定向而導緻最終對象來自其它 URL,則最初下載下傳的政策檔案可能不适用于該對象的最終 URL,而最終 URL 對于安全性決策非常重要。如果發現處于這種情況,可以在收到
ProgressEvent.PROGRESS
或
Event.COMPLETE
事件後檢查
LoaderInfo.url
的值,它會告訴您該對象的最終 URL。接着,用一個基于該對象的最終 URL 的政策檔案 URL 調用
Security.loadPolicyFile()
方法。然後輪詢
LoaderInfo.childAllowsParent
的值,直到它變為
true
。
不需要為運作于應用程式沙箱中的 AIR 内容設定此屬性。AIR 應用程式沙箱中的内容調用
BitmapData.draw()
方法時可以使用任何已加載的圖像内容作為源。
securityDomain | 屬性 |
public var securityDomain:SecurityDomain = null
語言版本: | ActionScript 3.0 |
指定用于
Loader.load()
操作的安全域。隻應在加載 SWF 檔案(而不是圖像)時使用此屬性。
隻有在被加載的 SWF 檔案與執行加載的 SWF 檔案可能來自不同的域(不同的伺服器)時,選擇安全域才有意義。從您自己的域加載 SWF 檔案時,始終會将它放置到您的安全域中。但是,在從其它域加載 SWF 檔案時,您有兩種選擇: 您可以允許将被加載的 SWF 檔案放置到其“自然的”安全域中,此安全域與執行加載的 SWF 檔案的安全域不同;這是預設設定。另一種選擇是通過将
myLoaderContext.securityDomain
設定為與
SecurityDomain.currentDomain
相同,指出您希望将被加載的 SWF 檔案放置到執行加載的 SWF 檔案所在的安全域中。這稱作導入加載 ,就安全性而言,它等同于将被加載的 SWF 檔案複制到您自己的伺服器,然後從該伺服器加載它。為使導入加載成功完成,被加載的 SWF 檔案的伺服器必須具有一個政策檔案,并且該政策檔案必須信任執行加載的 SWF 檔案的域。
您隻能在
LoaderContext.securityDomain
中傳遞您自己的安全域。如果試圖傳遞任何其它安全域,則會引發
SecurityError
異常。
AIR 應用程式安全沙箱中的内容無法将其他沙箱中的内容加載到其 SecurityDomain 中。
有關詳細資訊,請參閱《ActionScript 3.0 程式設計》 中的“安全性”一章。