在as3的开发中,经常会加载外部共用资源,比如某一个公用的图片或者其它小特效。这时候为了避免重复请求,一般会将这些资源放在一个fla文件中,为每一个资源添加链接。这里以一张图片为例(flower.fla):
这样就生成了一个名为flower.swf文件,将其放在b.com域下,访问路径为:http://b.com/swf/flower.swf
新建一个名为main.fla文件,如果是在fla内加载flower.swf文件,可以这样定义(本地加载文件,不需要设置LoaderContext的securityDomain属性,否则会报错):
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
ldr.load(req, ldrContext);
new Bitmap();
bmp.bitmapData = bmpData;
bmp.x = 0;
bmp.y = 0;
addChildAt(bmp, 0);
因为使用的是子域名加载(new ApplicationDomain(ApplicationDomain.currentDomain)),所以使用当前域ApplicationDomain.currentDomain,是不能获得到MyFlower类的定义。而loader.contentLoaderInfo.applicationDomain无论是以:当前域(ApplicationDomain.currentDoamin)、子域(new ApplicationDomain(ApplicationDoamin.currentDomain))、新域(new ApplicationDomain()),都可以访问到加载的swf。
如果main.swf与flower.swf属于同一域则不需要设置ldrContext的securityDomain属性,而假设main.swf放在a.com下,而flower.swf放在b.com域下,则需要设置该属性(ldrContext.securityDomain = SecurityDomain.currentDomain;)。否则在访问加载的swf时,会报安全沙箱冲突,而main.swf在第一次加载flower.swf时,会先加载b.com根目录下的crossdomain.xml(http://b.com/crossdomain.xml)文件。
完整的Main.as(舞台上先放置了一个从库里拖拽出来的button,而且取消了“自动声明舞台实例”)
new Bitmap();
bmp.bitmapData = bmpData;
bmp.x = 0;
bmp.y = 0;
addChildAt(bmp, 0);
}
}
}
有兴趣可以扩展阅读更多(很经典的文章):
教程:深入理解Flash的沙箱 – Application Domains
教程:深入理解Flash的沙箱 – Security Domains