js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)


Posted in Javascript onMarch 25, 2011

看个例子:

<input type="button" name="" value="载入图片" onclick="addImg('tt.jpg')" /> 
<script type="text/javascript"> 
<!-- 
function addImg(isrc) 
{ 
var Img = new Image(); 
Img.src = isrc; 
Img.onload = function () 
{ 
document.body.appendChild(Img); 
} 
} 
//--> 
</script>

当包含上述代码的页面打开时并不载入 “tt.jpg” ,当点击按钮时候才载入。当载入完成后触发onload事件显示到页面上。如果你是第一次加载 “tt.jpg" 这张图片的话,运行正常。点击按钮加载并显示一张图片,如果重复点击会怎么样呢?
IE、Opera中,除了第一次加载 图片时候显示正常,之后再点击就没有反应了,刷新也一样。难道它们只触发一次 ”onload“ 事件?是缓存机制?
FF、Chrom中,每点击一次加载一张该图片。

稍微修改下:

<input type="button" name="" value="载入图片" onclick="addImg('tt.jpg')" /> 
<script type="text/javascript"> 
<!-- 
function addImg(isrc) 
{ 
var Img = new Image(); 
Img.onload = function () 
{ 
document.body.appendChild(Img); 
} 
Img.src = isrc; 
} 
//--> 
</script>

运行后发现,奇怪的事情发生了。所有的浏览器都一致了,都是每点击一次加载一张图片。这又是什么原因?由此可以见 IE、Opera 执行过程中并不是只触发一次 onload 事件!

联想一下 Image 对象的一些属性看看,complete、readyState(IE专属值[uninitialized,complete]) (为防止缓存影响效果请更换图片名称!)

<input type="button" name="" value="complete" onclick='alert("complete : "+Img.complete +"\nreadyState : "+Img.readyState)' /> 
<input type="button" name="" value="载入图片" onclick="addImg('mtm.jpg')" /> 
<script type="text/javascript"> 
<!-- 
var Img; 
function addImg(isrc) 
{ 
Img = new Image(); 
//Img.src = isrc; 
Img.onload = function () 
{ 
alert("complete : "+Img.complete +"\nreadyState : "+Img.readyState) 
document.body.appendChild(Img); 
} 
Img.src = isrc; 
} 
//--> 
</script>

经过以上测试,可以看出一些不同点,对于 complete 属性来讲,IE是根据图片是否显示过来判断,就是说当加载的图片显示出来后,complete 属性的值才为 true ,否则一直是 false ,和以前是否加载过该张图片没有关系,即和缓存没有关系!但是其它浏览器表现出来的确不一样,只要以前加载过该图,浏览器有缓存,complete 就为 true ,这和IE的 readyState 属性的表现一致!
至此,可以肯定的是所有的浏览器都会缓存图片!可是上面的问题到底是什么原因导致的呢?
众所周知,从缓存里加载东西的速度是很快的,那么在
...
Img.src = isrc;
Img.onload = ...
...
的过程中,难道 IE、Opera 加载的速度快到,来不及追加事件?

这回加载一张根本不存在的图片看看效果:

<input type="button" name="" value="complete" onclick='alert("complete : "+Imgttmt.complete +"\nreadyState : "+Imgttmt.readyState)' /> 
<input type="button" name="" value="载入图片" onclick="addImg('mtmttyt.jpg')" /> 
<script type="text/javascript"> 
<!-- 
var Imgttmt; 
function addImg(isrc) 
{ 
Imgttmt = new Image(); 
Imgttmt.src = isrc; 
alert("complete : "+Imgttmt.complete +"\nreadyState : "+Imgttmt.readyState) 
Imgttmt.onload = function () 
{ 
alert("impossible") 
} 
} 
//--> 
</script>

可以肯定的是所有浏览器都不触发 onload 事件。从是否缓存或已经加载过图片的角度讲,IE、Opera表现正常,complete 始终为 false ;IE的 readyState 始终为uninitialized 。令人疑惑的是FF,其中 Imgttmt.complete 的值一直是 true ;更令人困惑的是 Chrom,它是在最初 new Imgttmt() 的时候 Imgttmt.complete 值为 false。而之后 Imgttmt.complete 值就一直为 true 了!如果换一张从来没有加载过的图片,FF和Chrom 的行为就一致了,都是一开始加载时, Imgttmt.complete 值为false, 之后为 true!
测试的过程中还发现,脚本的执行顺序的确会影响到类似于 onload 等事件的追加,如果在其显示后在追加事件就没有什么实际意义了!基于 javascript 这种解释性语言的特性,在追加事件的时候一定要注意把事件追加在触发该事件的句柄之前。
Javascript 相关文章推荐
javaScript checkbox 全选/反选及批量删除
Apr 28 Javascript
window.print打印指定div指定网页指定区域的方法
Aug 04 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
Aug 10 Javascript
基于jQuery实现Accordion手风琴自定义插件
Oct 13 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
Dec 20 Javascript
微信小程序 数据封装,参数传值等经验分享
Jan 09 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
Sep 22 Javascript
Angular中支持SCSS的方法
Nov 18 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
Apr 04 Javascript
微信小程序使用wxParse解析html的实现示例
Aug 30 Javascript
layui之table checkbox初始化时选中对应选项的方法
Sep 02 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
Sep 14 Javascript
基于jquery的3d效果实现代码
Mar 23 #Javascript
jquery 操作表格实现代码(多种操作打包)
Mar 20 #Javascript
jQuery实现的Email中的收件人效果(按del键删除)
Mar 20 #Javascript
jquery图片上下tab切换效果
Mar 18 #Javascript
javascript一些实用技巧小结
Mar 18 #Javascript
jquery获取下拉列表的值为null的解决方法
Mar 18 #Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
Mar 17 #Javascript
You might like
盘点被央视点名过的日本动画电影 一部比一部强
2020/03/08 日漫
PHP+MYSQL中文乱码问题
2015/07/01 PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
2017/06/30 PHP
javascript 常用代码技巧大收集
2009/02/25 Javascript
jQuery 表格插件整理
2010/04/27 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
React学习笔记之条件渲染(一)
2017/07/02 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
vue.js前后端数据交互之提交数据操作详解
2018/04/24 Javascript
Node.js系列之安装配置与基本使用(1)
2019/08/30 Javascript
[02:07]DOTA2新英雄展现中国元素,完美“圣典”亮相央视
2016/12/19 DOTA
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
python构建深度神经网络(DNN)
2018/03/10 Python
在python中做正态性检验示例
2019/12/09 Python
利用python中集合的唯一性实现去重
2020/02/11 Python
python实时监控logstash日志代码
2020/04/27 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
利物浦足球俱乐部官方网上商店:Liverpool FC Official Store
2018/01/13 全球购物
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
什么是唯一索引
2015/07/05 面试题
优秀的教师个人的中文求职信
2013/09/21 职场文书
人力资源管理专业应届生求职信
2014/04/24 职场文书
故意杀人案辩护词
2015/05/21 职场文书
德能勤绩工作总结
2015/08/11 职场文书
千万级用户系统SQL调优实战分享
2022/03/03 MySQL
详细介绍Java中的CyclicBarrier
2022/04/13 Java/Android
Nginx本地配置SSL访问的实例教程
2022/05/30 Servers