`
steely816
  • 浏览: 130132 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

主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相互调用对方类的通用方法,但其中上面文档中的红色字体的,我实验了下,应该是不可以的。编译都报错,怎么 可行?是文档用词不恰当还是我方法不对

分享到:
评论

相关推荐

    Flex中SWF和SWF文件之间的通信案例

    该案例中TestLocalConnection为主SWF文件加载了TestLocalConnectionReceiver.SWF,两者之间是在同一个域下的通信,工程代码编译路径需要下载者手动修改下。其他技术细节参见Flex_API中的LocalConnection章节。本机...

    flash加载多个SWF

    首先,理解SWF加载的基本原理是至关重要的。在Flash中,我们可以使用`Loader`类来加载SWF文件。`Loader`类是ActionScript 3.0中的一个关键组件,它允许我们加载各种类型的内容,包括图像、SWF文件、视频等。为了加载...

    flash builder 4.7加载外部swf文件

    以下是一个基本的示例代码,展示了如何在AS3中加载SWF: ```actionscript import flash.display.Loader; import flash.events.Event; var loader:Loader = new Loader(); loader.contentLoaderInfo....

    外部加载swf+控制

    2. **控制加载的SWF**: 一旦SWF被加载到主应用程序中,可以通过Loader对象与之通信。你可以访问加载的SWF中的公共类、函数或变量,实现对它的控制。例如,如果SWF有一个名为`play()`的公开方法,你可以这样调用它: ...

    加载外部swf

    以下是一个基本的加载SWF文件的步骤: 1. **创建Loader对象**:首先,你需要创建一个`Loader`对象,它是负责加载内容的容器。 ```as3 var loader:Loader = new Loader(); ``` 2. **添加事件监听器**:在加载过程中...

    AS3.0 进度条控制加载的swf

    接下来,我们讨论如何控制被加载SWF的当前帧。当SWF加载完成后,我们可以将其添加到舞台,并通过`Loader.content`属性访问加载的电影剪辑。然后,可以使用`play()`和`stop()`方法来控制播放: ```actionscript ...

    flash actionscript3 从1个SWF中加载另1个SWF 按1播放SWF中的一段 按2播放另一段动画.rar

    3. **SWF嵌套与控制**:加载的SWF文件会被包含在`Loader`对象的`content`属性中,可以将其转换为`MovieClip`类型,以便于在主SWF中对其进行操作。例如,通过按钮点击事件来播放不同的动画片段。 ```actionscript ...

    flex加载as2写的swf,内容是一个很雷的网页游戏AD

    在Flex中,我们可以使用`flash.display.Loader`类来加载SWF文件。这个类提供了加载二进制数据(如SWF文件)并将其作为显示对象插入显示列表的能力。`Loader`类的`load()`方法接受一个`URLRequest`对象,其中包含了...

    AS3 调用SWF类库

    6. **交互与通信**:一旦SWF加载成功,你就可以通过`Loader`对象的`content`属性访问其内部的类和对象。如果SWF包含公开的类或方法,你可以实例化这些类或调用这些方法。 例如,假设SWF库有一个名为`MyClass`的类,...

    Flex控制SWF播放

    如果SWF文件内部没有暴露必要的控制接口,我们可能需要通过反射或者其他方式与SWF进行通信。ActionScript 3的`flash.utils.getDefinitionByName()`函数可以帮助我们获取SWF内部的类或函数。 6. **Flex与Flash集成...

    多个swf的通讯

    - 两个SWF需要在同一个目录下或者Flex应用通过`SWFLoader`加载Flash SWF,以便它们可以在运行时互相通信。 **AS3的SWF之间通讯:** - AS3的SWF可以直接进行跨脚本通讯(Cross-Scripting),不需要`LocalConnection`...

    swf小文件,一般用于网站测试

    SWF文件通常包含ActionScript代码,这是一种基于ECMAScript的脚本语言,用来控制动画的行为、处理用户输入和与其他网页元素通信。 1. ActionScript:ActionScript是SWF文件的核心,它赋予了Flash内容动态性和交互性...

    flash actionscript3游戏开发之 1个swf加载另1个swf并调用其中的元件类.rar

    这里的`onLoaded`函数会在SWF加载完成后被调用,可以用来处理加载的SWF文件。 一旦SWF加载完成,我们可以通过`Loader`对象的`content`属性访问加载的内容。如果加载的SWF包含可交互的元件类,这些类通常会作为`...

    利用socket传SWF到Flash

    总的来说,这个技术方案通过Java与Flash间的socket通信实现了动态加载SWF文件,有效地防止了浏览器缓存问题。这种实时性对于那些需要频繁更新内容或需要个性化服务的应用场景非常有用,比如在线游戏、实时数据可视化...

    SWF播放器.rar 播放SWF文件

    ActionScript使得SWF文件不仅可以展示静态图像和动画,还能响应用户输入、处理数据和与其他网络资源通信。 SWF播放器通常具备以下特性: 1. 兼容性:支持不同版本的SWF文件,确保老版本和新版本的文件都能正常播放...

    Flex控制swf简单源码

    加载SWF文件的核心在于使用`Loader`类,它是AS3中的一个核心组件,负责加载各种类型的媒体资源,包括SWF文件。 以下是一段基本的Flex代码示例,展示了如何加载和控制外部SWF文件: ```actionscript import flash....

    swf文件打包下载

    - **应用**:主要用于创建动画效果、处理用户输入、与服务器通信等。 3. **网页设计中的应用**: - **增强用户体验**:SWF文件可以用来制作吸引人的加载动画、交互式导航栏和动态展示内容,提高用户在网站的停留...

    页面JS连播SWF源码

    3. **Flash Player API**:在支持的情况下,JavaScript可以通过Flash Player提供的ActionScript External Interface (ASEI)与SWF进行通信。这允许JS调用SWF内部的方法,如播放、停止、前进或后退等。 4. **定时器...

    Flex控制外部引用SWF的播放进度源码

    以下是一个基本的加载SWF的示例代码: ```actionscript var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, swfLoaded); loader.load(new URLRequest("path_to_your_...

    页面SWF的布局及实现

    1. **JavaScript通信**:使用Flash External Interface (ExternalInterface) API,SWF文件可以与JavaScript进行双向通信。这使得你可以控制SWF的行为,如播放、暂停、跳转等,也可以根据SWF的事件更新HTML页面状态。...

Global site tag (gtag.js) - Google Analytics