• 图片预加载 解决图片加载闪动问题


     

    方法一:

     
    <script type="text/javascript">
    var img01 = new Image();
    var img02 = new Image();
    var img03 = new Image();
    var img04 = new Image();
    img01.src = "img/1.jpg";
    img02.src = "img/2.jpg";
    img03.src = "img/3.jpg";
    img04.src = "img/4.jpg";
    </script>
     
     

    缺点:如果加载图片较多,比较麻烦

    方法二:

    var images = new Array();
    
    function preLoad() {
    
        for (var i = 0; i < preLoad.arguments.length; i++) {
    
            imgs[i] = new Image();
    
            imgs[i].src = preLoad.arguments[i];
    
        }
    
    }
    
    preLoad("img/1.jpg", "img/2.jpg", "img/3.jpg");

     

     

    学到的小知识:arguments:由当前函数传入参数组成,用法与数组类似

     

    方法三:ajax实现,使用Ajax,比直接使用JavaScript,优越之处在于JavaScript和CSS的加载不会影响到当前页面。该方法简洁、高效。

    window.onload = function() {
        setTimeout(function() {
            // XHR to request a JS and a CSS
            var xhr = new XMLHttpRequest();
            xhr.open('GET', 'http://domain.tld/preload.js');
            xhr.send('');
            xhr = new XMLHttpRequest();
            xhr.open('GET', 'http://domain.tld/preload.css');
            xhr.send('');
            // preload image
            new Image().src = "http://domain.tld/preload.png";
        }, 1000);
    };

     

     

    上面代码预加载了“preload.js”、“preload.css”和“preload.png”。1000毫秒的超时是为了防止脚本挂起,而导致正常页面出现功能问题。

     

    JavaScript来实现该加载过程:

    window.onload = function() {
        setTimeout(function() {
            // reference to <head>
            var head = document.getElementsByTagName('head')[0];
            
            // a new CSS
            var css = document.createElement('link');
            css.type = "text/css";
            css.rel = "stylesheet";
            css.href = "http://domain.tld/preload.css";
    
            // a new JS
            var js = document.createElement("script");
            js.type = "text/javascript";
            js.src = "http://domain.tld/preload.js";
    
            // preload JS and CSS
            head.appendChild(css);
            head.appendChild(js);
    
            // preload image
            new Image().src = "http://domain.tld/preload.png";
        }, 1000);
    };
    这里,我们通过DOM创建三个元素来实现三个文件的预加载。正如上面提到的那样,使用Ajax,加载文件不会应用到加载页面上。从这点上看,Ajax方法优越于JavaScript。
     

    加载完毕回调

    function loadImage(url, callback) {
        var img = new Image();
        //创建一个Image对象,实现图片的预下载
        img.src = url;
        if (img.complete) {
            //如果图片已经存在于浏览器缓存,直接调用回调函数
            callback.call(img);
            return;
            // 直接返回,不用再处理onload事件
        }
    
        img.onload = function() {
            // 图片下载完毕时异步调用callback函数。
    
            callback.call(img);
            // 将回调函数的this替换为Image对象
        };
    };
     

  • 相关阅读:
    xshell的优化和连接
    系统安装后的linux和vmware的网络配置
    CentOS安装系统安装完成
    最快让你上手ReactiveCocoa之进阶篇
    最快让你上手ReactiveCocoa之基础篇
    提升自己逼格的编程之美之代码规范
    告别2016迎接2017,分享一些第三方插件
    Swift 3.0 令人兴奋,但Objective-C也有小改进--Objective-C的类属性
    ReactiveCocoa 5.0 初窥:可能是最痛的一次升级
    react+antd+select+lodash模糊搜索防抖
  • 原文地址:https://www.cnblogs.com/yinzf/p/5902914.html
Copyright © 2020-2023  润新知