2010-11-10 44 views
13

當您將SWF加載到另一個SWF中時,加載器SWF可以使用ApplicationDomain.getDefinition(name:String)從加載的SWF中獲取特定的定義。例如:如何獲得加載的SWF的ApplicationDomain中的所有定義?

package 
{ 
    // ... imports 

    public class SWFLoader extends Sprite 
    { 
     private var loadedAppDomain:ApplicationDomain; 

     public function SWFLoader() 
     { 
      var request:URLRequest = new URLRequest("test.swf"); 
      var loader:Loader = new Loader(); 
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onTestLoadComplete); 
      loader.load(request); 
     } 

     private function onTestLoadComplete(event:Event):void 
     { 
      var loaderInfo:LoaderInfo = LoaderInfo(event.target); 
      loadedAppDomain = loaderInfo.applicationDomain; 

      // Here we can get ANY defined symbol (class, namespace or function according to Adobe Flash help) 
      var someSymbolClass:Class = Class(loadedAppDomain.getDefinition("SomeSymbol")); 
      var someSymbolSprite:Sprite = Sprite(new someSymbolClass()); 

      addChild(sprite); 
     } 
    } 
} 

如何獲取SWF中的所有定義,而不明確指定每個定義?

回答

14

從Flash Player 11.3開始,您可以使用ApplicationDomain.getQualifiedDefinitionNames()

請參閱the official documentation for the methodthis blog post about the Flash Player release

+0

美麗。最後,Adobe添加了此功能:) – 2012-10-24 13:48:20

+0

截至2014年3月31日,該方法沒有實際記錄。 ApplicationDomain的文檔鏈接中沒有提及'getQualifiedDefinitionNames'。然而,該方法有效,並且它返回一個「Vector」。 '在該特定的ApplicationDomain中定義的類。另請注意,即使getDefinition/hasDefinition將爲父域中定義的類返回true,它也不會返回父域的定義。 – Triynko 2014-03-31 19:06:08

+1

它被記錄在那裏,但您需要將播放器版本設置爲11.3或更高才能看到它。在頁面標題下方的頂部。 – 2014-05-15 05:12:55

0

您必須將加載的SWF放入當前的ApplicationDomain中。

使用ApplicationDomain.currentDomain在ContextLoader info上執行此操作。

loader.load(request, new ContextLoader(false, ApplicationDomain.currentDomain)); 

它應該工作。

+0

然後呢?我有權訪問加載的SWF的所有類,名稱空間和函數?我可以運行:'var someSymbolSprite:Sprite = Sprite(new SomeSymbol())'? – 2010-11-10 12:35:49

+0

是的,您可以訪問加載的swf中的每個符號,就好像它們是在當前電影中聲明的一樣。 – blue112 2010-11-10 13:27:12

10

編輯:這是最快的解決問題的方法:http://www.bytearray.org/?p=175

嗨,你可以使用這個庫:https://github.com/claus/as3swf/wiki/ 不要有時間做更深入的測試,但這裏是我發現:

1 - 我已經創建包含在庫2導出的MC,$測試和一個.swf $的Test2 2 - 一旦通過加載器加載。瑞士法郎,我運行這樣的代碼:

var swf : SWF = new SWF(loader.contentLoaderInfo.bytes); 
trace(swf); 

3 - 在輸出中,你會發現論文線:

[76:SymbolClass] 
    Symbols: 
    [0] TagID: 2, Name: $Test2 
    [1] TagID: 1, Name: $Test 

我認爲有一種方法直接獲得該信息直通庫API

+0

非常好,我會用SWFExplorer謝謝! – 2010-11-10 15:41:46

-1

從我從以前得到的回答繼問題我前幾天問這裏(這是關於SWC,但在你的情況下,它並沒有真正有所作爲)
Working with SWCs - getDefinitionByName issue

如果兩個SWF文件共享相同的ApplicationDomain,你應該能夠訪問加載SWF類直接通過這樣做:

//provided that SomeSymbol extends Sprite... 
var someSymbolSprite:Sprite =new SomeSymbol(); 

在另一方面,除非你從加載的SWF

var ssym:SomeSymbol; 

創建對象庫檢查上面的鏈接,你將不能夠做到這一點

var SomeSymbol:Class = getDefinitionByName("SomeSymbol"); 

更多細節。

+0

但是這個例子是一樣的,我必須知道符號'SomeSymbol'存在。我想要一個所有符號的列表,而不用硬編碼每個人。 – 2010-11-10 15:38:44

相關問題