2011-12-21 21 views
1

我有一个名为main.swf的容器swf,它使用Loader类将子swf加载到容器中。AS 3父子电影剪辑中的调用函数

在AS2中,我可以使用

_root.someFunction(); 

是AS3我有一个问题,如何做到这一点调用的main.swf容器的功能。

我已经尝试使用:

MovieClip(root.parent.parent).someFunction(); 

(获得child.swf的根,父是装载机,父母是main.swf中)

但这就要到了为空

是有没有办法做到这一点,以便它不会在子SWF中引发错误,并在加载到主SWF时工作?

回答

4

我不知道你的代码是在时间轴上还是在课堂上。我认为这是在时间轴的第一帧。如果是这样,在A.swf中你可以有:

function someFunction():void{ 
    trace("called from B.swf"); 
} 
// 
var mLoader:Loader = new Loader(); 
var mRequest:URLRequest = new URLRequest("B.swf"); 
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler); 
mLoader.load(mRequest); 
// 
function onCompleteHandler(loadEvent:Event):void 
{ 
     container.addChild(loadEvent.currentTarget.content); 
} 

,并在您B.swf中(由A.swf中加载到其实例名称为 “容器” 的MovieClip):

btn.addEventListener(MouseEvent.MOUSE_DOWN,callA); 
// 
function callA(e:MouseEvent) 
{ 
    if (this.parent.parent != null) 
    { 
     var p:MovieClip = this.parent.parent as MovieClip; 
     p.someFunction(); 
    } 
} 

不是很优雅,但它应该工作。我会使用事件,但你问直接函数调用。

+0

我对main.swf的代码位于文档类中,而children.swfs中的代码在时间线的第一帧 – 2011-12-22 13:38:37

+0

@jamie holliday:但你现在解决了吗? – AsTheWormTurns 2011-12-22 14:21:18

2

这可以通过调用parent.parent.somefunction();

我给下面的例子

家长雪碧

public class Main1 extends Sprite 
{ 
    public function Main1() 
    { 
     super(); 

     var loader:Loader = new Loader(); 
     addChild(loader); 
     loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void{ 
      trace("I am parent .... I am calling a child function"); 
      Object(loader.content).invoke(); 

     }); 
     loader.load(new URLRequest("Sample1.swf")); 

    } 

    public function invoke():void{ 
     trace("I am parent .... Child invoked this function"); 
    } 
} 

儿童雪碧

public class Sample1 extends Sprite 
{ 
    public function Sample1() 
    { 
     super(); 
    } 


    public function invoke():void{ 
     trace("I am child .... I am calling parent function"); 
     (Object(parent.parent)).invoke(); 
    } 


} 

编译样本1后运行MAIN1应该给下面的跟踪

我亲...我打电话子函数

我的孩子....我打电话父功能

我父母....儿童调用此函数

+0

谢谢,经过一些额外的玩耍后,我发现加载器的父母始终为空。这是因为在子swf试图访问它的父级(主swf)之前,加载程序尚未添加到显示列表中 – 2011-12-21 17:35:39

0

我遇到了同样的问题,将AS2代码更新为AS3。但我正在使用一个数组来调用一个SWF列表来自动加载一个又一个的按钮。

我把你的解决方案解决了这个问题,并根据我的需求进行了塑造,并且它很有效!谁想要我的代码,这就是:

容器(父)SWF调用加载器加载主权财富基金的阵列(时间轴的第1帧):

import flash.net.URLRequest; 
stop(); 

// Module Name and pages // 

var mcArray:Array = new Array("swf/1-Intro.swf", 
         "swf/2-DOTdefinition.swf", 
         "swf/3-HazardousTable.swf", 
         "swf/4-BillsofLading.swf", 
         "swf/5-PaperBillsofLading.swf", 
         "swf/6-ReturnsManifest_v2.swf", 
         "swf/7-BillsOfLading.swf", 
         "swf/8-HazardClasses.swf", 
         "swf/9-HazardClasses2.swf", 
         "swf/11-ORMD.swf", 
         "swf/12-ID_Number.swf", 
         "swf/13-PackingGroup.swf", 
         "swf/14-ThinkAboutIt.swf", 
         "swf/15-EmergencyResponseBook.swf", 
         "swf/16-Labels.swf", 
         "swf/17-WhyKeepRecords_P1.swf", 
         "swf/17-WhyKeepRecords_P2.swf", 
         "swf/18-EmergencyResponseProcedures.swf", 
         "swf/19-SpillManagement.swf", 
         "swf/20-PreventativeMeasures.swf", 
         "swf/21-Security_v3.swf", 
         "swf/22-Certification.swf"); 

// Movie Clip Loader 

var myMCL:Loader = new Loader(); 
var curFrameNum:Number = 0; 

myMCL.addEventListener(Event.COMPLETE, loadNext); 

function loadNext() { //this should be a global variable 
var url:String = mcArray[curFrameNum]; 
var urlRequest:URLRequest = new URLRequest(url); 
myMCL.load(urlRequest); 
addChild(myMCL); 
curFrameNum++; 
} 

loadNext(); 

的呼吁父方法放在每个SWF电影(子)的最后一帧:

stop(); 
parent.parent.loadNext(); 
2

它的工作原理! 只是改变 “_root” 与 “影片剪辑(根)” 这样 动作脚本2

_root.movieclip1.stop(); 

动作脚本3

MovieClip(root).movieclip1.stop(); 

“movieclip1” 是实例名

的工作!

0

如果剪辑B里面夹A(或剪辑B是内根),和你想调用驻留在A /根从剪辑B“someFunction”,这点符号为我工作:

影片剪辑(this.parent).someFunction();