现在的位置: 首页 > 综合 > 正文

关于flash/flex的程序跨域访问swf或者图片资源

2013年05月09日 ⁄ 综合 ⁄ 共 1432字 ⁄ 字号 评论关闭

subject of application domain of flash and air.

在flash或flex中,程序加载外部swf文件,该文件的程序域默认为主程 序域的一个子域中。比如你使用A.swf加载B.swf文件,B被加载后,成为A程序域的一个子域,子域是申明类的时,不能覆盖父类已申明类:如果A中定 义了类com.sogou.Map类,同时B中也定义了com.sogou.Map类,但是当B加入到A的程序域时,先检查A程序域中是否已存在一个类。 如果存在,则使用该已存在类,否则申明属于B子程序域的类。当然也可以将B不加载到默认域中,而是新建一个域:
var loader:Loader = new Loader();

var context:LoaderContext = new LoaderContext();
context.applicationDomain = new ApplicationDomain();

loader.load(new URLRequest(”B.swf”), context);

同时,A可以使用B程序域中的类:
var bDomain:ApplicationDomain = loader.contentLoaderInfo.applicationDomain;
if (bDomain.hasDefinition(”com.sogou.map::JustForB”)) {
//判断一个程序域中是否已定义一个类
var bc:class = bDomain.getDefinition(”com.sogou.map::JustForB”) as class;
var bcInst:Object = new bc();
}
然后便可使用在B中定义的类JustForB类。当然B亦可使用A程序域中的类,前提是B的域为A程序域的一个子域,B可以直接使用。

再就是,将B加载加入到当前程序域中:
var loader:Loader = new Loader();

var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;

loader.load(new URLRequest(”B.swf”), context);
此时A和B的可以直接使用任何方所定义的任何类了(当然后定义的类不能覆盖先定义的类,即B中的com.sogou.map.Map不能覆盖A中的com.sogou.map.Map,二者任何地方使用的Map类都将来自A的定义。)

 


请注意:对于Load加载外部文件跨域问题分为两大类问题,一是对于swf,另一种是非swf文件,比如图片资源(jpg,png等)这时候,以上解决方案已经不适用,解决方案为:

 

 

指定context的checkPolicyFile属性为true,即为:

var context:LoaderContext = new LoaderContext();

context.checkPolicyFile = true;

var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/photo11.jpg");

var ldr:Loader = new Loader();

ldr.load(urlReq, context);

 

 

参考:http://www.javaeye.com/topic/581893

 

 

抱歉!评论已关闭.