zoukankan      html  css  js  c++  java
  • 转载:用Jquery实现的图片预加载技术,可以实现有序加载和无序加载!

    一、背景

    我们在做页面的时候,从用户体验的角度出发,肯定是希望用户以最快的速度看到完整的页面信息,但在实际情况中经常会遇到些问题。

    比如受网速影响,页面加载素材的时间比较长,页面会出现短时间的错乱或者闪屏;

    二、Preload插件实现

    /**
     * 图片预加载插件Preload
     * 
     * @param array imgs  预加载的图片地址数组列表
     * @param Object options  配置参数
     */
    
    (function ($) {
        function Preload(imgs, options) {
            this.imgs = (typeof imgs === 'string') ? [imgs] : imgs;
            this.options = {
                order: false, //默认值false,代表无序加载
                minTimer: 0, //完成加载的最少时间,单位ms,默认为0,一般展示类型的loading动画会需要设置
                each: null, //单张图片加载完执行的方法,一般是修改进度状态
                end: null //所有图片加载完执行的方法,一般是隐藏loading页
            };
            this.timer = Date.now();
            this.init(options);
        };
        //插件初始化
        Preload.prototype.init = function (options) {
            //配置参数合并
            this.options = $.extend(this.options, options);
            if (this.options.order) {
                this.ordered(); //有序加载
            } else {
                this.unordered(); //无序加载
            }
        };
        // 有序加载
        Preload.prototype.ordered = function () {
            var that = this,
                imgs = this.imgs,
                len = imgs.length,
                count = 0,
                options = this.options;
            load();
    
            function load() {
                var img = new Image();
                $(img).on('load error', function () {
                    options.each && options.each(count);
                    if (count >= len-1) {
                        //所有图片加载完毕,检查是否满足最小loading时间
                        var timerCount = Date.now() - that.timer;
                        if (timerCount < options.minTimer) {
                            var timeout = options.minTimer - timerCount;
                            setTimeout(function () {
                                options.end && options.end();
                            }, timeout);
                        }else{
                            options.end && options.end();
                        }
                    } else {
                        load();
                    }
                    count++
    
                });
                // onload函数要写在改变src前,这样确保了onload函数一定会被调用
    
                img.src = imgs[count];
            }
        };
        // 无序加载
        Preload.prototype.unordered = function () {
            var that = this,
                imgs = this.imgs,
                len = imgs.length,
                count = 0,
                options = this.options;
            for (var i = 0; i < len; i++) {
                var img = new Image();
                $(img).on('load error', function () {
                    options.each && options.each(count);
                    if (count >= len-1) {
                        //所有图片加载完毕,检查是否满足最小loading时间
                        var timerCount = Date.now() - that.timer;
                        if (timerCount < options.minTimer) {
                            var timeout = options.minTimer - timerCount;
                            setTimeout(function () {
                                options.end && options.end();
                            }, timeout);
                        }else{
                            options.end && options.end();
                        }
                    }
                    count++;
                })
                img.src = imgs[i];
            }
        };
        //扩展到jQuery对象上
        $.extend($,{
            preload: function (imgs, options) {
                new Preload(imgs, options);
            }
        });
    })(jQuery);

    三、用法:

    1、引入上面的插件js,可以自己定义一个js文件名字。

    2、执行如下代码

    imgs是你罗列的需要传入的需要预加载图片的数组集合。

    //图片预加载
    $.preload(imgs, {
      order:false, //true代表有序加载,默认为false无序加载 each:
    function (count) {
         //per为此时加载的百分比

    let per =
    Math.round((count+1) / len * 100) + '%';
    }, end: function () { 
      //这里代表加载完毕的执行代码
      $(
    '.loading').hide();
      }
    });
  • 相关阅读:
    [saiku] 系统登录成功后查询Cubes
    216. Combination Sum III
    215. Kth Largest Element in an Array
    214. Shortest Palindrome
    213. House Robber II
    212. Word Search II
    211. Add and Search Word
    210. Course Schedule II
    分硬币问题
    开始学习Python
  • 原文地址:https://www.cnblogs.com/teamemory/p/9828434.html
Copyright © 2011-2022 走看看