利用CSS、JavaScript及Ajax实现高效的图片预加载


Posted in Javascript onOctober 16, 2013

方法一:用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 相关文章推荐
filters.revealTrans.Transition使用方法小结
Aug 19 Javascript
在Windows上安装Node.js模块的方法
Sep 25 Javascript
使用JavaScript动态设置样式实现代码及演示动画
Jan 25 Javascript
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
May 27 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
Dec 23 Javascript
JavaScript中的call方法和apply方法使用对比
Aug 12 Javascript
使用javaScript动态加载Js文件和Css文件
Oct 24 Javascript
javascript每日必学之封装
Feb 23 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
Jun 28 Javascript
elementUI Tree 树形控件的官方使用文档
Apr 25 Javascript
js 判断当前时间是否处于某个一个时间段内
Sep 19 Javascript
vue quill editor 使用富文本添加上传音频功能
Jan 14 Javascript
div模拟滚动条效果示例代码
Oct 16 #Javascript
Jquery实现的tab效果可以指定默认显示第几页
Oct 16 #Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
Oct 16 #Javascript
限制textbox或textarea输入字符长度的JS代码
Oct 16 #Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
Oct 15 #Javascript
纯Javascript实现Windows 8 Metro风格实现
Oct 15 #Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
Oct 15 #Javascript
You might like
php 图片加水印与上传图片加水印php类
2010/05/12 PHP
基于PHP开发中的安全防范知识详解
2013/06/06 PHP
深入Memcache的Session数据的多服务器共享详解
2013/06/13 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
2014/06/22 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
如果文字过长,则将过长的部分变成省略号显示
2006/06/26 Javascript
记录几个javascript有关的小细节
2007/04/02 Javascript
JS 跳转页面延迟2种方法
2013/03/29 Javascript
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
js控制文本框输入的字符类型方法汇总
2015/06/19 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
2015/09/16 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
2016/05/24 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
2016/08/19 Javascript
canvas实现手机端用来上传用户头像的代码
2016/10/20 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
利用Vue实现简易播放器的完整代码
2020/12/30 Vue.js
python 调用HBase的简单实例
2016/12/18 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
华为的Java面试题
2014/03/07 面试题
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
生物化学研究助理员求职信
2013/10/09 职场文书
医药专业推荐信
2013/11/15 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
法律专业求职信
2014/05/24 职场文书
vue实现登陆页面开发实践
2022/05/30 Vue.js