2010-12-06 111 views
0

我有兩個swf文件託管在不同的域aaa.com/a.swf和bbb.com/b.swf上。 a.swf正在加載b.swf並試圖將其轉換爲某個界面。當這兩個swf文件在同一個域中時,一切正常。但是,當它們位於不同的域中時,在將b.swf投射到實現的接口IComponent後,我會變爲null。這兩個swf都是使用use-network = true編譯的,並且具有相同的IComponent.as。Flash中的跨域問題

public class Wrapper extends Sprite 
{ 
    public function Wrapper() 
    { 
     super(); 
     var request:URLRequest = new URLRequest("http://aaa.com/Component.swf"); 
     var loaderContext:LoaderContext = new LoaderContext(); 
      loaderContext.applicationDomain = ApplicationDomain.currentDomain; 
     var loader:Loader = new Loader(); 
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadingComplete); 
      loader.load(request,loaderContext); 
      addChild(loader); 
    } 

    private function onLoadingComplete(event:Event):void 
    { 
     var target:LoaderInfo = event.target as LoaderInfo; 
     var component:IComponent = target.content as IComponent; 
      component.init({"s":1}); 
      component.run();  
    } 

} 

public class Component extends Sprite implements IComponent 
{ 
    public function Component() 
    { 
     super(); 
     Security.allowInsecureDomain("*"); 
    } 

    public function init(params:Object):void 
    { 
     //some actions 
    } 

    public function run():void 
    { 
     //some actions 
    } 

} 
+0

我認爲包裝是A.swf中的文檔類和組件是b.swf的文檔類。是根據target.content加載的嗎?你能找出它嗎? – momo 2010-12-06 17:57:10

+0

是的。包裝器正在加載組件,然後試圖將其轉換爲IComponent – 2010-12-08 16:24:50

回答

-1

我關於語法錯誤的想法是沒有意義的,這裏是一個編輯:

驗證碼:

private function ololo():void{ 
     var request:URLRequest = new URLRequest("http://domain/file.swf"); 
     var loaderContext:LoaderContext = new LoaderContext(); 
      loaderContext.applicationDomain = ApplicationDomain.currentDomain; 
     var loader:Loader = new Loader(); 
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadingComplete); 
      loader.load(request,loaderContext); 
    } 

    private function onLoadingComplete(e:Event):void { 
     var target:LoaderInfo = e.target as LoaderInfo; 
     addChild(target.content as Sprite); 
    } 

效果很好,即使文件在完全不同的領域。
如果您將IComponent視爲Sprite,它會起作用嗎?

+0

如果這是問題,代碼將永遠不會運行! OP代碼是有效的... – PatrickS 2010-12-07 02:05:55

+0

你的代碼和我的代碼完全一樣。)投射到雪碧不是一個好主意。 – 2010-12-07 06:25:39

+0

@Pul Yuriychuck所以你的代碼工作,如果你把它作爲雪碧?恕我直言,這是有用的信息 – www0z0k 2010-12-07 07:34:17

1

試試這個:

//Assuming you've set a crossdomain policy file 
var loaderContext:LoaderContext = 
      new LoaderContext(true , ApplicationDomain.currentDomain) 

似乎它不工作的原因與eit這個事實有關她的IComponent不被識別或定義衝突。我本來以爲在ApplicationDomain設置爲currentDomain的情況下,應該避免定義衝突...但可能值得嘗試將每個SWF保留在其自己的域中。

//Assuming you've set a crossdomain policy file 
var loaderContext:LoaderContext = 
      new LoaderContext(true); 

您還可以在加載其他SWF之前檢查IComponent「是否存在」。這可能有助於診斷髮生了什麼...

var ClassName:Object = getDefinitionByName('IComponent'); 
trace(ClassName); 
0

感謝所有的答案,我今天找到了一個可行的解決方案。 相反鑄造加載內容的IComponent的我澆鑄成反對

var component:Object = (event.target as LoaderInfo).content as Object; 
    component["init"](null); 
component["run"](); 

我的FROM測試,即使我們使用的是帶有靜態字段和它不工作方法共享類confimed。包裝器和組件都在實例化它們自己的共享類實例。這真的很奇怪。

如果你有同樣的問題,請確保您的包裝/組件類有要求的Security.allowDomain

0

這是在播放器中的錯​​誤:

http://bugs.adobe.com/jira/browse/ASC-3529

它當您嘗試發生「共享」從不同域加載的swfs之間的接口。這應該工作,只要你把兩個swfs放在同一個應用程序域下(就像你一樣)。

使用一個對象的工作原理,但首先使用接口的目的。

下面是基本加載SWF爲二進制一種變通方法,然後使用Loader::loadBytes瑞士法郎實際加載到內存中:

http://blog.aleksandarandreev.com/?p=42