我有一个简单的应用程序,一部电影在同一个域中加载另一个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);
}
提前致谢
答案 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)
答案 2 :(得分:0)
问题可能是您将'资产'转换为MovieClip
,它可能是Sprite
。最好将整个事情放在try .. catch
或if
以防万一,并将其转换为安全*
类型以避免编译时错误(或者如果你想要整个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
语句应该为您提供一些额外的调试信息,以帮助您确定加载的对象类型以及它是否具有您尝试访问的功能。
如果这对您有用,请告诉我。