【问题标题】:AS 3 Call function in parent from child movieclipAS 3 从子影片剪辑中调用父函数
【发布时间】:2023-04-03 18:57:01
【问题描述】:

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

在 AS2 中,我可以使用

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

是 AS3 我有问题如何做到这一点。

我尝试过使用:

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

(获取child.swf的root,parent是loader,parent是main.swf)

但这是空值

有什么方法可以做到这一点,这样它就不会在子 swf 中引发错误,并且在加载到主 swf 时可以工作?

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    如果剪辑 B 在剪辑 A 内(或剪辑 B 在根内),并且您想从剪辑 B 调用驻留在 A/root 中的“someFunction”,则此点符号对我有用:

    MovieClip(this.parent).someFunction();

    【讨论】:

      【解决方案2】:

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

      _root.movieclip1.stop();
      

      动作脚本 3

      MovieClip(root).movieclip1.stop();
      

      “movieclip1”是实例名称

      它的工作!

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题,将我的 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】:

          我不知道您的代码是在时间轴中还是在类中。我认为它在时间线的第一帧。如果是这样,在 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 加载到实例名称为“容器”的影片剪辑中):

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

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

          【讨论】:

          • main.swf 的代码在文档类中,children.swfs 中的代码在时间轴的第一帧
          【解决方案5】:

          这可以通过调用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 应该会给出以下跟踪

          我是父母……我正在调用子函数

          我是孩子....我正在调用父函数

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

          【讨论】:

          • 谢谢,在玩了一些额外的游戏之后,我注意到加载器的父级始终为空。这是因为在子 swf 试图访问它的父(主 swf)之前,加载器尚未添加到显示列表中
          猜你喜欢
          • 2015-10-09
          • 2011-07-13
          • 2012-02-04
          • 1970-01-01
          • 2011-01-19
          • 1970-01-01
          • 2014-09-19
          • 2014-09-28
          • 1970-01-01
          相关资源
          最近更新 更多