Loader程序域

今天又被这个搞得焦头烂额!

 

下文转自 http://bbs.9ria.com/thread-28431-1-1.html

 


Loader的 load方法有两个参数

第二个参数是LoaderContext对象

LoaderContext对象里有一个applicationDomain(程序域)对象

设置程序域对象可以设置两个SWF之间的共享库...

加载器的 ApplicationDomain 的子级。默认值。 可以使用语法 new ApplicationDomain(ApplicationDomain.currentDomain) 显式表示这种选择。 这将允许所加载的 SWF 文件直接使用父级的类,例如,可通过编写 new MyClassDefinedInParent() 来使用。 但是父级则不能使用此语法;如果父级要使用子级的类,它必须调用 ApplicationDomain.getDefinition() 来检索它们。 这种选择的优点是,如果子级定义的类与父级已经定义的类同名,不会出现错误结果;子级只会继承父级对该类的定义,除非子级或父级调用 ApplicationDomain.getDefinition() 方法来检索子级的冲突定义,否则将不使用此定义。
  1. var loader:Loader = new Loader();
  2. var context:LoaderContext = new LoaderContext();
  3. context.applicationDomain =   new ApplicationDomain(ApplicationDomain.currentDomain);
  4. loader.load(new URLRequest("text.swf"),context);
  5. loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
  6. function onComplete(e:Event):void
  7. {
  8.         var Circle:Class = this.loaderInfo.applicationDomain.getDefinition("Circle") as Class;
  9.         var circle:MovieClip = new Circle();
  10.         addChild(circle);
  11. }
  12. //输出:ReferenceError: Error #1065: 变量 Circle 未定义。
  13.         at flash.system::ApplicationDomain/getDefinition()
  14.         at load_fla::MainTimeline/onComplete()
复制代码
加载器自己的 ApplicationDomain。使用 ApplicationDomain.currentDomain 时请使用此应用程序域。 加载完成后,父级和子级可以直接使用对方的类。 如果子级试图定义的类与父级已经定义的类同名,将出现错误并放弃加载。
  1. var loader:Loader = new Loader();
  2. var context:LoaderContext = new LoaderContext();
  3. context.applicationDomain = ApplicationDomain.currentDomain;
  4. loader.load(new URLRequest("text.swf"),context);
  5. loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
  6. function onComplete(e:Event):void
  7. {
  8.         var Circle:Class = this.loaderInfo.applicationDomain.getDefinition("Circle") as Class;
  9.         var circle:MovieClip = new Circle();
  10.         addChild(circle);
  11. }
  12. //正常加载
复制代码
系统 ApplicationDomain 的子级。使用 new ApplicationDomain(null) 时请使用此应用程序域。 这将完全分离加载方和被加载方,从而允许它们使用相同的名称定义各自版本的类并且不会产生冲突或隐藏。 一方查看另一方的类的唯一方式是调用 ApplicationDomain.getDefinition() 方法。
  1. var loader:Loader = new Loader();
  2. var context:LoaderContext = new LoaderContext();
  3. context.applicationDomain = new ApplicationDomain(null);
  4. loader.load(new URLRequest("text.swf"),context);
  5. loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
  6. function onComplete(e:Event):void
  7. {
  8.         var Circle:Class = this.loaderInfo.applicationDomain.getDefinition("Circle") as Class;
  9.         var circle:MovieClip = new Circle();
  10.         addChild(circle);
  11. }
  12. //输出:ReferenceError: Error #1065: 变量 Circle 未定义。
  13.         at flash.system::ApplicationDomain/getDefinition()
  14.         at load_fla::MainTimeline/onComplete()
复制代码
其它 ApplicationDomain 的子级。有时可能会有更复杂的 ApplicationDomain 层次结构。 可以将 SWF 文件从您自己的 SecurityDomain 加载到任何 ApplicationDomain 中。 例如,new ApplicationDomain(ApplicationDomain.currentDomain.parentDomain.parentDomain) 将 SWF 文件加载到当前域父级的父级的新子级中。

附上测试文件

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值