从加载的SWF中监听事件?

时间:2010-09-01 18:39:48

标签: actionscript-3 flash

我有一个简单的应用程序,一部电影在同一个域中加载另一个SWF。我可以在加载的SWF中访问变量和函数,但不能从按钮中侦听事件;接收运行时错误:错误#1009:无法访问空对象引用的属性或方法

按钮的链接属性已设置

主要

var assetLoader:Loader = new Loader();
assetLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadingComplete);
assetLoader.load(new URLRequest("home.swf");

function loadingComplete(evt:Event):void {
...
var asset:MovieClip = assetLoader.content as MovieClip;
asset.homeTrace("function in loaded SWF");
trace("var in loaded SWF:", asset.lastFrame);
// Error #1009
asset.enterApp.addEventListener(MouseEvent.CLICK, homeButtons);
...
}

var lastFrame:Boolean = false;

function homeTrace(p1:String) {
  trace(p1);
}

提前致谢

3 个答案:

答案 0 :(得分:0)

我已经实施了一个解决方案,而不是我想要的,但工作正常。因为我无法为加载的电影中的按钮添加监听器,所以我添加了一个通用的并使用开关来区分发送者对象:

asset.addEventListener(MouseEvent.CLICK, homeButtons);
...
function homeButtons(evt:MouseEvent):void {
  switch(evt.target.toString()) {
    case "[object Send]":
      nextScreen(evt);
      break;
    case "[object Enter]":
      tmpEnter(evt);
      break;
  }
}

答案 1 :(得分:0)

您发布了常规解决方案,但如果您看得更深,则可以找到解决方案如何添加事件监听器here并阅读整个架构here

问候
尤金

答案 2 :(得分:0)

问题可能是您将'资产'转换为MovieClip,它可能是Sprite。最好将整个事情放在try .. catchif以防万一,并将其​​转换为安全*类型以避免编译时错误(或者如果你想要整个home使用一个接口并合并两个applicationDomain上下文,但这是一个广泛的主题)

function loadingComplete(evt:Event):void {
   ...
   var asset:* = assetLoader.content;
   if(asset != null){
      try{
         connectModule(asset);
      }catch(err:Error){
         trace("Error accessing module functions", err.getStackTrace());
      }
   }else{
      trace("No module");
   }
}

function connectModule(module:*):void{
   trace("Using typeof", typeof(module), "using constructor", module.constructor, "has the function?", module['homeTrace'] != null);
   module.homeTrace("Function load in swf");
   ...
}

trace中的connectModule语句应该为您提供一些额外的调试信息,以帮助您确定加载的对象类型以及它是否具有您尝试访问的功能。 如果这对您有用,请告诉我。