实现图片预加载的三大方法及优缺点分析


Posted in Javascript onNovember 19, 2014

预加载图片是提高用户体验的一个很好方法。图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度。这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速、无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验。本文将分享三个不同的预加载技术,来增强网站的性能与可用性。

方法一:用CSS和JavaScript实现预加载

实现预加载图片有很多方法,包括使用CSS、JavaScript及两者的各种组合。这些技术可根据不同设计场景设计出相应的解决方案,十分高效。
单纯使用CSS,可容易、高效地预加载图片,代码如下:

#preload-01 { background: url(http://domain.tld/image-01.png) no-repeat -9999px -9999px; }    

#preload-02 { background: url(http://domain.tld/image-02.png) no-repeat -9999px -9999px; }    

#preload-03 { background: url(http://domain.tld/image-03.png) no-repeat -9999px -9999px; } 

将这三个ID选择器应用到(X)HTML元素中,我们便可通过CSS的background属性将图片预加载到屏幕外的背景上。只要这些图片的路径保持不变,当它们在Web页面的其他地方被调用时,浏览器就会在渲染过程中使用预加载(缓存)的图片。简单、高效,不需要任何JavaScript。
该方法虽然高效,但仍有改进余地。使用该法加载的图片会同页面的其他内容一起加载,增加了页面的整体加载时间。为了解决这个问题,我们增加了一些JavaScript代码,来推迟预加载的时间,直到页面加载完毕。代码如下:

// better image preloading @ <A href="http://perishablepress.com/press/2009/12/28/3-ways-preload-images-css-javascript-ajax/">http://perishablepress.com/press/2009/12/28/3-ways-preload-images-css-javascript-ajax/</A> function preloader() {    

    if (document.getElementById) {    

        document.getElementById("preload-01").style.background = "url(http://domain.tld/image-01.png) no-repeat -9999px -9999px";    

        document.getElementById("preload-02").style.background = "url(http://domain.tld/image-02.png) no-repeat -9999px -9999px";    

        document.getElementById("preload-03").style.background = "url(http://domain.tld/image-03.png) no-repeat -9999px -9999px";    

    }    

}    

function addLoadEvent(func) {    

    var oldonload = window.onload;    

    if (typeof window.onload != 'function') {    

        window.onload = func;    

    } else {    

        window.onload = function() {    

            if (oldonload) {    

                oldonload();    

            }    

            func();    

        }    

    }    

}    

addLoadEvent(preloader); 

在该脚本的第一部分,我们获取使用类选择器的元素,并为其设置了background属性,以预加载不同的图片。
该脚本的第二部分,我们使用addLoadEvent()函数来延迟preloader()函数的加载时间,直到页面加载完毕。
如果JavaScript无法在用户的浏览器中正常运行,会发生什么?很简单,图片不会被预加载,当页面调用图片时,正常显示即可。

方法二:仅使用JavaScript实现预加载

上述方法有时确实很高效,但我们逐渐发现它在实际实现过程中会耗费太多时间。相反,我更喜欢使用纯JavaScript来实现图片的预加载。下面将提供两种这样的预加载方法,它们可以很漂亮地工作于所有现代浏览器之上。

JavaScript代码段1
只需简单编辑、加载所需要图片的路径与名称即可,很容易实现:

<div class="hidden">    

    <script type="text/javascript">    

        <!--//--><![CDATA[//><!--             var images = new Array()    

            function preload() {    

                for (i = 0; i < preload.arguments.length; i++) {    

                    images[i] = new Image()    

                    images[i].src = preload.arguments[i]    

                }    

            }    

            preload(    

                "http://domain.tld/gallery/image-001.jpg",    

                "http://domain.tld/gallery/image-002.jpg",    

                "http://domain.tld/gallery/image-003.jpg"  

            )    

        //--><!]]>     </script>    

</div> 

该方法尤其适用预加载大量的图片。我的画廊网站使用该技术,预加载图片数量达50多张。将该脚本应用到登录页面,只要用户输入登录帐号,大部分画廊图片将被预加载。

JavaScript代码段2
该方法与上面的方法类似,也可以预加载任意数量的图片。将下面的脚本添加入任何Web页中,根据程序指令进行编辑即可。

<div class="hidden"> 

    <script type="text/javascript"> 

        <!--//--><![CDATA[//><!--             if (document.images) { 

                img1 = new Image(); 

                img2 = new Image(); 

                img3 = new Image(); 

                img1.src = "http://domain.tld/path/to/image-001.gif"; 

                img2.src = "http://domain.tld/path/to/image-002.gif"; 

                img3.src = "http://domain.tld/path/to/image-003.gif"; 

            } 

        //--><!]]>     </script> 

</div>

正如所看见,每加载一个图片都需要创建一个变量,如“img1 = new Image();”,及图片源地址声明,如“img3.src =
"../path/to/image-003.gif";”。参考该模式,你可根据需要加载任意多的图片。
我们又对该方法进行了改进。将该脚本封装入一个函数中,并使用 addLoadEvent(),延迟预加载时间,直到页面加载完毕。

function preloader() {    

    if (document.images) {    

        var img1 = new Image();    

        var img2 = new Image();    

        var img3 = new Image();    

        img1.src = "http://domain.tld/path/to/image-001.gif";    

        img2.src = "http://domain.tld/path/to/image-002.gif";    

        img3.src = "http://domain.tld/path/to/image-003.gif";    

    }    

}    

function addLoadEvent(func) {    

    var oldonload = window.onload;    

    if (typeof window.onload != 'function') {    

        window.onload = func;    

    } else {    

        window.onload = function() {    

            if (oldonload) {    

                oldonload();    

            }    

            func();    

        }    

    }    

}    

addLoadEvent(preloader); 

方法三:使用Ajax实现预加载

上面所给出的方法似乎不够酷,那现在来看一个使用Ajax实现图片预加载的方法。该方法利用DOM,不仅仅预加载图片,还会预加载CSS、JavaScript等相关的东西。使用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。

好了,本文就先介绍到这里,三种实现图片预加载技术的方法大家都已经了解了吧,具体哪个更高效,我想小伙伴们也都看出来了,那就应用到自己的项目中吧。

Javascript 相关文章推荐
jQuery弹出层插件简化版代码下载
Oct 16 Javascript
javascript实现跳转菜单的具体方法
Jul 05 Javascript
jQuery增加与删除table列的方法
Mar 01 Javascript
JS平滑无缝滚动效果的实现代码
May 06 Javascript
jquery取消事件冒泡的三种方法(推荐)
May 28 Javascript
JS中的进制转换以及作用
Jun 26 Javascript
分享JS数组求和与求最大值的方法
Aug 11 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
Feb 21 Javascript
react.js 获取真实的DOM节点实例(必看)
Apr 17 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
Nov 06 Javascript
vue cli 3.x 项目部署到 github pages的方法
Apr 17 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
Sep 04 Javascript
jQuery Ajax()方法使用指南
Nov 19 #Javascript
javascript匿名函数实例分析
Nov 18 #Javascript
Linux下使用jq友好的打印JSON技巧分享
Nov 18 #Javascript
删除Javascript Object中间的key
Nov 18 #Javascript
如何在MVC应用程序中使用Jquery
Nov 17 #Javascript
Jquery实现仿腾讯微博发表广播
Nov 17 #Javascript
JavaScript数组常用操作技巧汇总
Nov 17 #Javascript
You might like
PHP如何编写易读的代码
2007/07/10 PHP
用PHP与XML联手进行网站编程代码实例
2008/07/10 PHP
6种php上传图片重命名的方法实例
2013/11/04 PHP
PHP实现变色验证码实例
2014/01/06 PHP
ThinkPHP有变量的where条件分页实例
2014/11/03 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
自己的js工具 Cookie 封装
2009/08/21 Javascript
Array.prototype 的泛型应用分析
2010/04/30 Javascript
Jquery easyui 下loaing效果示例代码
2013/08/12 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
2016/02/01 Javascript
移动端日期插件Mobiscroll.js使用详解
2016/12/19 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
2017/11/02 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
2020/08/10 Javascript
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
Python程序设计入门(5)类的使用简介
2014/06/16 Python
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
python数组复制拷贝的实现方法
2015/06/09 Python
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
解决python升级引起的pip执行错误的问题
2018/06/12 Python
用Python解数独的方法示例
2019/10/24 Python
Python-openCV读RGB通道图实例
2020/01/17 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
市场营销毕业生自荐信
2013/11/23 职场文书
学校消防安全责任书
2014/07/23 职场文书
超市创意活动方案
2014/08/15 职场文书
学习优秀共产党员先进事迹思想报告
2014/09/17 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
PL350与SW11的比较
2021/04/22 无线电
Springboot集成阿里云OSS上传文件系统教程
2021/06/28 Java/Android
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript