主swf与被加载swf的通信问题

AS3中,swf加载另一个swf时,两者之间的通信问题跟被加载到的应用程序域有很大关系。应用程序域大概有四种,这里直接引用Flash帮助文档的说 明:

  • 加载器的 ApplicationDomain 的子级。 默认值。 可以使用语法 new ApplicationDomain (ApplicationDomain .currentDomain) 显式表示这种选择。 这将允许所加载的 SWF 文件直接使用父级的类,例如,可通过编 写 new MyClassDefinedInParent() 来使用 。 但是父级则不能使用此语法;如果父级要使用子级的类,它必须调用 ApplicationDomain .getDefinition() 来检索它们。 这种选择的优点是,如果子级定义的类与父级已经定义的类同名,不会出现错误结果;子级只会继承父级对该类的定义,除非子级或父级调用 ApplicationDomain .getDefinition() 方法来检索子级的冲突定义,否则将不使用此定义。
  • 加载器自己的 ApplicationDomain 使 用 ApplicationDomain .currentDomain 时请使用此应用程序域。 加载完成后,父级和子级可以直接使用对方的类 。 如果子级试图定义的类与父级已经定义的类同名,将出现错误并放弃加载。
  • 系统 ApplicationDomain 的子级。 使 用 new ApplicationDomain (null) 时请使用此应用程序域。 这将完全分离加载方和被加载方,从而允许它们使用相同的名称定义各自版本的类并且不会产生冲突或隐藏。 一方查看另一方的类的唯一方式是调用 ApplicationDomain .getDefinition() 方法。
  • 其它 ApplicationDomain 的子级。 有 时可能会有更复杂的 ApplicationDomain 层次结构。 可以将 SWF 文件从您自己的 SecurityDomain 加载到任何 ApplicationDomain 中。 例如,new ApplicationDomain (ApplicationDomain .currentDomain.parentDomain.parentDomain) 将 SWF 文件加载到当前域父级的父级的新子级中。

第四种稍微复杂点,我们不讨论。
1,子swf访问父swf文档类方法:
在子swf被加载完成后,一般都是采用同一种方式:this.parent.parent.函数名()进行访问;
2,子swf访问父swf中的类:
很多人认为子swf是不能获得父swf的类,其实是可以的。大概思路是:获取父swf的应用程序域,然后通过getDefinition方法。
而1和2,要在子swf被加载完成而且父swf也初始化完毕后调用才正确,否则有可能出现错误。这里一个比较好的方法是在父swf中,当子swf被加载完 成时调用子swf的两个方法,分别将父swf本身的引用和父swf应用程序域的引用传给子swf。示例代码:
var swfTarget = event.target.content;
swfTarget.traceFromLoaded();
swfTarget.getParent(this);//getParent为子swf的一个方法
swfTarget.getParentDomain(ApplicationDomain.currentDomain);//getParentDomain 为子swf的一个方法
其中getParent与getParentDomain方法实现为:
private var _parentObj:Object;
private var _parentDomain:ApplicationDomain;
public function getParent(parentObj:Object):void {
_parentObj = parentObj;
}
public function getParentDomain(parentDomain:ApplicationDomain):void {
_parentDomain = parentDomain;
}
3,父swf访问子swf文档类方法:
用Loader的属性content得到对子swf的引用,然后就可以调用其方法了。示例代码:
var swfTarget = event.target.content;
swfTarget.函数名();
4,父swf访问子swf中的类:
a,不管是上述的哪种域环境,通用的一种方法是,获得子swf的域引用,然后用getDefinition获得要用到的类引用,示例代码:
//LoaderInfo对象承载载入swf文件的信息
var swfTarget:LoaderInfo=event.target as LoaderInfo;
//swfTarget的只读属性applicationDomain返回一个ApplicationDomain
//创建被加载swf的应用程序域
var appDomain:ApplicationDomain=swfTarget.applicationDomain as ApplicationDomain;
//getDefinition方法从指定的应用程序域获取一个公共定义。
//该定义可以是一个类、一个命名空间或一个函数的定义。
//其中"myClass"为被加载swf文件里影片剪辑链接属性里的类
var MCClass:Class=appDomain.getDefinition("MyClass") as Class;
//创建MCClass实例,并返回影片剪辑对象
var myMCA:MovieClip=(new MCClass()) as MovieClip;
var myMCB:MovieClip=(new MCClass()) as MovieClip;
b,如果子swf跟父swf在同一应用程序域中,则可直接通过getDefinitionByName()方法对子swf的类进行调用,其他域则不行;
总结:getDefinition是子父swf相互调用对方类的通用方法,但其中上面文档中的红色字体的,我实验了下,应该是不可以的。编译都报错,怎么 可行?是文档用词不恰当还是我方法不对

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值