as3 Loader.load()时出现错误“Error #2025: 提供的 DisplayObject 必须是调用者的子级”的解决方案...

 

最近因为项目需要,所以开始了as3的开发之旅。今天遇到一个问题,就是在用flash.display.Loader的load()方法的时候,如果反复调用load(),就会出现“Error #2025: 提供的 DisplayObject 必须是调用者的子级”的错误,核心代码如下:

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->         public  function  loadPhoto(picURL): void  {
            _loader.load(
new  URLRequest(picURL));
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
            _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
        }
        
        protected 
function  onLoad(event:Event): void  {
            content.addChild(_loader.content);
            _eventDispatcher.dispatchEvent(
new  Event(PhotoLoader.EVENTS_LOAD));
        }

 

搜索了相关的问题,说是每次用到Loader对象的时候,都去new一下,就可以避免这个错误,试了试,果然可以正常使用了,代码改成这样:

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->         public  function  loadPhoto(picURL): void  {
            _loader 
=   new  Loader(); //这里多加了一条new Loader()的语句
            _loader.load(
new  URLRequest(picURL));
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
            _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
        }
        
        protected 
function  onLoad(event:Event): void  {
            content.addChild(_loader.content);
            _eventDispatcher.dispatchEvent(
new  Event(PhotoLoader.EVENTS_LOAD));
        }

 

不过每次都去new的话,内存开销肯定受不了,所以不敢采用这个方案,于是请教了涵涵同学,丫说可以把Loader对象直接作为Sprite对象的子节点,也就是改成这样

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->         public  function  loadPhoto(picURL): void  {
            _loader.load(
new  URLRequest(picURL));
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
            _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
        }
        
        protected 
function  onLoad(event:Event): void  {
            
if (content.numChildren == 0 ){ //这里加上了只有第一次装载时才add到容器中的判断
                content.addChild(_loader);
//这里直接添加_loader对象,因为Loader也是从DisplayObject类继承过来的,所以能直接用
            }
            
            _eventDispatcher.dispatchEvent(
new  Event(PhotoLoader.EVENTS_LOAD));
        }

 

果然这样直接就可以用,而且不需要每次都去new了。

为什么会出现这种情况呢?

我又把代码改回去调试了一下:

 

            trace(_loader.content.parent);
            content.addChild(_loader.content);
            trace(_loader.content.parent);

输出:

    [object Loader]

    [object Sprite]

 

 

由此可见,_loader.content的父节点被改变了(废话,因为被addChild到另外的DisplayObject里了),所以可能Loader的load()方法在处理content的时候,用到了content.parent这个对象,结果因为parent被改变了,所以出错了,有研究过as3类库源码的同学可以出来帮忙说明一下下^_^。

所以之前的代码改为这样既可:

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->         public  function  loadPhoto(picURL): void  {
            _loader.load(
new  URLRequest(picURL));
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
            _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
        }
        
        protected 
function  onLoad(event:Event): void  {
            
if (content.numChildren == 0 ){
                content.addChild(_loader);
            }
            
            _eventDispatcher.dispatchEvent(
new  Event(PhotoLoader.EVENTS_LOAD));
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值