加载SWF 通信
AS3中,swf加载另一个swf时,两者之间的通信问题跟被加载到的应用程序域有很大关系
加载器的 ApplicationDomain 的子级。默认值。 可以使用语法 new ApplicationDomain(ApplicationDomain.currentDomain) 显式表示这种选择。 这将允许所加载的 SWF 文件直接使用父级的类,例如,可通过编写 new MyClassDefinedInParent() 来使用。 但是父级则不能使用此语法;如果父级要使用子级的类,它必须调用 ApplicationDomain.getDefinition() 来检索它们。 这种选择的优点是,如果子级定义的类与父级已经定义的类同名,不会出现错误结果;子级只会继承父级对该类的定义,除非子级或父级调用 ApplicationDomain.getDefinition() 方法来检索子级的冲突定义,否则将不使用此定义。
加载器自己的 ApplicationDomain。使用 ApplicationDomain.currentDomain 时请使用此应用程序域。 加载完成后,父级和子级可以直接使用对方的类。 如果子级试图定义的类与父级已经定义的类同名,将出现错误并放弃加载。
系统 ApplicationDomain 的子级。使用 new ApplicationDomain(null) 时请使用此应用程序域。 这将完全分离加载方和被加载方,从而允许它们使用相同的名称定义各自版本的类并且不会产生冲突或隐藏。
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.函数名();