您需要使用 UrlLoader 加载远程 SWF,然后通过 loadByte 重新加载。使用这种方法,您将通过安全性。
package
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
public class TestDistantSwf extends Sprite
{
private var _urlLoader : URLLoader = new URLLoader;
private var _loader : Loader = new Loader;
public function TestDistantSwf()
{
addChild(_loader);
// Won't work
//_loader.load(new URLRequest("http://localhost/test.swf"));
// Load it as binary
_urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
_urlLoader.addEventListener(Event.COMPLETE, onLoad);
_urlLoader.load(new URLRequest("http://localhost/test.swf"));
}
private function onLoad(e : Event) : void
{
// Load distant swf data locally
_loader.loadBytes(_urlLoader.data, new LoaderContext(false, ApplicationDomain.currentDomain));
}
}
}
如果你需要像 flash var 这样传递参数,有两种方法,如果使用 Air 2.6 或更高版本,你可以使用 LoaderContext.parameters :
private function onLoad(e : Event) : void
{
var lc : LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
lc.parameters ={
foo:"hello !"
};
lc.allowCodeImport = true;
// Load distant swf data locally
_loader.loadBytes(_urlLoader.data, lc);
}
然后在加载的 SWF 中使用 loaderInfo.parameters 获取它。
或者您可以调用已加载的 Swf 函数:
private function onLoadBinary(e : Event) : void
{
e.target.content.init("hello 2 !");
}
private function onLoad(e : Event) : void
{
var lc : LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
lc.allowCodeImport = true;
// Load distant swf data locally
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadBinary);
_loader.loadBytes(_urlLoader.data, lc);
}
这将从其主类中加载的 swf 调用:
public function init(foo : String) : void
{
trace(foo);
}