:::: 菜单 ::::

as3载入影片中TypeError:Error #1009:无法访问空对象引用的属性或方法

今天遇到的一个问题:
一个swf文件,要在主文件中来载入这个swf,但是却始终遇到如下问题:
当执行loadSwf(“xxxx.swf”)后报错TypeError: Error #1009: 无法访问空对象引用的属性或方法。

载入代码如下:

  1. private function loadMainSwf(url):void {
  2. var urlR:URLRequest=new URLRequest(url);
  3. containtLoader.unload();
  4. containtLoader.load(urlR);
  5. containtLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,loadHandler);
  6. containtLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadCompHandler);
  7. }
  8. private function loadHandler(e:ProgressEvent):void {
  9. gLoad=e.target.bytesLoaded;
  10. gAll=e.target.bytesTotal;
  11. per=Math.floor(gLoad / gAll * 100);
  12. percent=per + "%";
  13. perString.text=percent;
  14. }
  15. private function loadCompHandler(e:Event):void {
  16. containtLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS,loadHandler);
  17. containtLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE,loadCompHandler);
  18. addChild(containtLoader);
  19. }

错误的位置是子影片绑定类的构造函数和子影片中所有其他类的构造函数.
上午去搜索看了下.有两种原因:

可能因为被载入的swf中舞台上有命名的元件
我没有测试。但根据以往经验,可能有两种可能:
1、ldr为空;
2、被载入的swf有绑定类,且舞台上有命名的元件。
解决办法:
1、确认 1.swf 与当前swf在相同目录
2、若被载入的swf有绑定类,且其舞台上有命名的元件,则将所有舞台(主时间轴)上的命名元件名去掉。
——蓝色理想BBS

我叨咕了半天发现罪魁祸首:stage,情况是:
子影片绑定的类构造语句中有

  1. stage.scaleMode = StageScaleMode.NO_SCALE;
  2. stage.align = StageAlign.TOP_LEFT;

单独测试子影片是没有问题的构造函数执行时trace(stage)为[object Stage].
这说明子影片在执行构造函数时已经可以访问stage了.
而当子影片被load进主影片时,情况就不同了,构造函数执行时trace(stage)为null.
这说明被load的子影片是先执行构造函数再和”舞台”交涉. 在执行构造函数时他根本不知道stage是个什么玩意(个人观点).
因此,我把子影片中对stage的操作放到了ADDED_TO_STAGE事件里就OK了.

  1. public function MousebombV9Index() {
  2. init();
  3. }
  4. private function init():void {
  5. //***其他语句….
  6. this.addEventListener(Event.ADDED_TO_STAGE,addStageHandler);
  7. }
  8. private function addStageHandler(e:Event):void {
  9. //舞台左上对齐
  10. stage.scaleMode = StageScaleMode.NO_SCALE;
  11. stage.align = StageAlign.TOP_LEFT;
  12. }

这样无论是自己独立用还是被load作子影片,都可以了.

延伸阅读


5 Comments

本文对您有用吗? 何不留下评论继续交流?