AS 3来自儿童movieclip的父级呼叫功能

时间:2011-12-21 16:37:38

标签: actionscript-3

我有一个名为main.swf的容器swf,它使用Loader类将子swf加载到容器中。

在AS2中,我可以使用

调用main.swf容器的函数
_root.someFunction();

AS3我有问题怎么做。

我尝试过使用:

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

(得到child.swf的根,父是加载器,父是main.swf)

但是这将是空的

有没有办法这样做,以便它不会在子swf中抛出错误,并在加载到主swf时工作?

5 个答案:

答案 0 :(得分: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加载到一个实例名称为“container”的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();
    }
}

不是很优雅,但应该有效。我会使用事件,但是你要求直接函数调用。

答案 1 :(得分: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();   
    }


}

在编译Sample1之后运行Main1应该给出以下跟踪

我是父母......我正在调用儿童功能

我是孩子......我打电话给父母的功能

我是父母......孩子调用了这个函数

答案 2 :(得分:2)

它有效! 只需使用“MovieClip(root)”更改“_root” 像这样 动作脚本2

_root.movieclip1.stop();

动作脚本3

MovieClip(root).movieclip1.stop();

“movieclip1”是实例名称

它的工作!

答案 3 :(得分:0)

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

我把你的解决方案解决了这个问题并且模塑以满足我的需求并且它有效!对于任何想要我的代码的人来说,这里是:

容器(父)SWF调用加载器加载SWF数组(在时间轴的第一帧):

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();

答案 4 :(得分:0)

如果剪辑B位于剪辑A内(或剪辑B位于根目录内),并且您想要调用" someFunction"它位于剪辑B的A / root中,这个点符号对我有用:

的MovieClip(this.parent).someFunction();