AS3父级按钮调用两级加载外部SWF中mc_target问题求助
两级加载SWF后父级访问内部影片剪辑的解决方案
问题场景
父级时间轴加载外部swf1,swf1内部再加载swf2,父级按钮需调用swf2内的mc_target并设置其可见性,但直接通过SWFMC1.SWFMC2.mc_target.visible = true;调用失败。
解决方案一:修正变量作用域与访问权限
1. 父级代码修改:将SWF引用改为全局变量
原代码中SWFMC是swfLoadedHandler内的局部变量,按钮点击时无法访问,需改为全局变量:
// 定义全局变量,供按钮事件访问 var SWFMC1: MovieClip; var swfLoader: Loader = new Loader(); var swfFile: URLRequest = new URLRequest("swf1.swf"); // 修正SWF路径格式 var context: LoaderContext = new LoaderContext(); context.allowCodeImport = true; swfLoader.load(swfFile, context); addChild(swfLoader); swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, swfLoadedHandler); function swfLoadedHandler(e: Event): void { SWFMC1 = MovieClip(swfLoader.content); SWFMC1.gotoAndStop(1); }
2. swf1代码修改:暴露SWF2的引用为公共属性
swf1内的SWFMC2需定义为公共属性,才能被父级访问:
// 在swf1的主类中声明公共变量 public var SWFMC2: MovieClip; var swfLoader2: Loader = new Loader(); var swfFile2: URLRequest = new URLRequest("swf2.swf"); var context2: LoaderContext = new LoaderContext(); context2.allowCodeImport = true; swfLoader2.load(swfFile2, context2); addChild(swfLoader2); swfLoader2.contentLoaderInfo.addEventListener(Event.COMPLETE, swf2LoadedHandler); function swf2LoadedHandler(e: Event): void { SWFMC2 = MovieClip(swfLoader2.content); SWFMC2.gotoAndStop(1); }
完成以上修改后,父级按钮的点击代码即可正常生效:
btn.addEventListener(MouseEvent.CLICK, onClick); function onClick(event:MouseEvent):void{ SWFMC1.SWFMC2.mc_target.visible = true; }
解决方案二:事件通信(解耦式实现)
若不想依赖层级变量引用,可通过自定义事件实现跨SWF通信,避免层级依赖问题:
1. 父级按钮事件:派发触发指令
btn.addEventListener(MouseEvent.CLICK, onClick); function onClick(event:MouseEvent):void{ // 向swf1派发冒泡事件 SWFMC1.dispatchEvent(new Event("showTargetMC", true)); }
2. swf1中转事件:转发指令给swf2
// 监听父级传来的事件 this.addEventListener("showTargetMC", forwardShowCommand); function forwardShowCommand(e:Event):void{ // 向swf2派发指令事件 SWFMC2.dispatchEvent(new Event("showTarget")); }
3. swf2响应事件:显示目标影片剪辑
// 监听显示指令 this.addEventListener("showTarget", showTargetMC); function showTargetMC(e:Event):void{ mc_target.visible = true; }
解决方案三:通过getChildByName逐级查找对象
若变量引用存在不确定性,可通过实例名逐级查找目标对象:
1. swf1中给Loader设置实例名
// 在swf1的加载代码中给Loader命名 swfLoader2.name = "swf2Loader";
2. 父级按钮事件中查找对象
btn.addEventListener(MouseEvent.CLICK, onClick); function onClick(event:MouseEvent):void{ // 逐级查找swf2的Loader和内部影片剪辑 var swf2Loader: Loader = Loader(SWFMC1.getChildByName("swf2Loader")); var swf2MC: MovieClip = MovieClip(swf2Loader.content); swf2MC.mc_target.visible = true; }
注意事项
- 路径正确性:加载SWF时的
URLRequest路径需与文件实际位置匹配,避免路径错误导致加载失败。 - 加载顺序校验:确保
swf1和swf2均加载完成后再执行访问操作,可通过事件通知机制确认加载状态。 - 安全沙箱限制:确保所有SWF文件处于同一域下,或正确配置跨域策略,避免安全权限问题。
内容的提问来源于stack exchange,提问作者Dika Atmaj
相关产品推荐
相关产品推荐

