AS3跨两个SWF之间的跨脚本问题

时间:2010-08-13 22:54:42

标签: flash actionscript-3

我有一个带有文档类(Main.as)的电影,它加载2个SWF:

private var mainContainer:Sprite = new Sprite();
addChild(mainContainer);

var loaderx:Loader = new Loader();
loaderx.contentLoaderInfo.addEventListener(Event.COMPLETE,loadingComplete);

loaderx.load(new URLRequest("PhotoLoader.swf")); // PhotoLoader.as


var viewer:Loader = new Loader();
viewer.contentLoaderInfo.addEventListener(Event.COMPLETE,loadingComplete);

viewer.load(new URLRequest("PhotoViewer.swf")); // PhotoViewer.as

private function loadingComplete(evt:Event):void {
  evt.target.removeEventListener(Event.COMPLETE,loadingComplete);
  mainContainer.addChild(evt.target.content);
}

现在我需要从PhotoViewer访问PhotoLoader中的一些var /对象,但是只要我编译PhotoViewer,编译器就会抱怨:

trace(root.loaderx.dbFields);
1119: Access of possibly undefined property loaderx through a reference with \
static type flash.display:DisplayObject.

注意我需要在2个加载的SWF之间进行通信,而不是从加载它们的电影中进行通信

1 个答案:

答案 0 :(得分:0)

修改

我很惊讶类型转换为MovieClip失败但是我再次只有你在这里展示的代码。根据错误消息,您可以执行此操作:

var photoLoader:PhotoLoader = PhotoLoader(evt.target.content );

甚至

evt.target.content as PhotoLoader

甚至比作为MovieClip进行投射更好,因为您可以直接访问属性& PhotoLoader类的方法!

我不确定你的环境是什么,你是对的,我以为你想要从Main类访问这些类。显然是我的错!如果你在每个SWF上都有DocumentClasses,那么它就是你的代码结构的方式,你没有事件需要LocalConnection,你可以将Singleton类用作FrontController,这是对两个类的属性的集中访问。

编辑结束

首先,您可以将加载程序内容转换为MovieClip,如下所示:

var content:MovieClip = MovieClip(evt.target.content);
mainContainer.addChild(content);

evt.target.content应该来自DisplayObject类型,因此您无法访问影片剪辑属性。

如果您需要访问已加载的SWF的属性,您应该像这样声明它们:

private var photoViewer:MovieClip;
private var photoLoader:MovieClip;

然后你可以这样做:

photoViewer = MovieClip(evt.target.content);
mainContainer.addChild(photoViewer);

photoLoader = MovieClip(evt.target.content);
mainContainer.addChild(photoViewer);

只需为您的加载器命名即可区分MovieClips

loaderx.name = "photoLoader";
viewer.name = "photoViewer";

然后你可以这样做

private function loadingComplete(evt:Event):void 
{
    switch(event.currentTarget.loader.name)
   {
        case "photoLoader":
          photoLoader = MovieClip(evt.target.content);
          mainContainer.addChild(photoLoader);
          break;

        case "photoViewer":
          photoViewer = MovieClip(evt.target.content);
          mainContainer.addChild(photoViewer);
          break;
   }

  if( photoViewer!= null && photoLoader!= null )
       evt.target.removeEventListener(Event.COMPLETE,loadingComplete);
}

之后你应该能够像这样访问你的MovieClips属性

trace( photoLoader.dbFields );

var prop:Object = photoViewer.whateverNameYouGaveToYourProperty;