three.js 源码分析之ImageLoader

/**

     * @author mrdoob / http://mrdoob.com/

     */

    这个类用于图像的下载,包括数据存储在url中的下载过程,需要注意的是跨域问题

    //图片下载器

    function ImageLoader( manager ) {

 

        this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;

 

    }

 

    Object.assign( ImageLoader.prototype, {

        //跨域

        crossOrigin: 'anonymous',

        //加载图片

        load: function ( url, onLoad, onProgress, onError ) {

 

            if ( url === undefined ) url = '';

 

            if ( this.path !== undefined ) url = this.path + url;

 

            //处理url访问

            url = this.manager.resolveURL( url );

 

            var scope = this;

            //首先从缓存中获取

            var cached = Cache.get( url );

            //缓存中存在

            if ( cached !== undefined ) {

                //开始回调

                scope.manager.itemStart( url );

 

                setTimeout( function () {

                    //空闲处理

                    if ( onLoad ) onLoad( cached );

                    //结束回调

                    scope.manager.itemEnd( url );

 

                }, 0 );

                //返回方式获取

                return cached;

 

            }

 

            //创建图片div

            var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );

 

            function onImageLoad() {

                //下载完成移出监听

                image.removeEventListener( 'load', onImageLoad, false );

                image.removeEventListener( 'error', onImageError, false );

                //将img添加到缓存(这个this是img自己)

                Cache.add( url, this );

                //回调

                if ( onLoad ) onLoad( this );

                //结束回调

                scope.manager.itemEnd( url );

 

            }

 

            function onImageError( event ) {

                //处理错误

                image.removeEventListener( 'load', onImageLoad, false );

                image.removeEventListener( 'error', onImageError, false );

 

                if ( onError ) onError( event );

 

                scope.manager.itemError( url );

                scope.manager.itemEnd( url );

 

            }

 

            //设置下载监听和错误监听

            image.addEventListener( 'load', onImageLoad, false );

            image.addEventListener( 'error', onImageError, false );

 

            //如果url中有没有图片数据

            if ( url.substr( 0, 5 ) !== 'data:' ) {

                //设置图片可以跨域访问

                if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;

 

            }

            //开始下载计数和回调

            scope.manager.itemStart( url );

            //开始下载

            image.src = url;

            //返回图片

            return image;

 

        },

        //设置跨域

        setCrossOrigin: function ( value ) {

 

            this.crossOrigin = value;

            return this;

 

        },

        //设置路径

        setPath: function ( value ) {

 

            this.path = value;

            return this;

 

        }

 

    } );

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值