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添加String.Format方法
Aug 11 Javascript
jQuery不兼容input的change事件问题解决过程
Dec 05 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
基于jQuery创建鼠标悬停效果的方法
Mar 07 Javascript
jQuery中extend函数详解
Jul 13 Javascript
jquery-tips悬浮提示插件分享
Jul 31 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
Sep 30 Javascript
js实现页面a向页面b传参的方法
May 29 Javascript
js正则表达式注册页面表单验证
Oct 11 Javascript
vue.js开发环境搭建教程
May 04 Javascript
Angular2使用vscode断点调试ts文件的方法
Dec 13 Javascript
mint-ui在vue中的使用示例
Apr 05 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
用PHP来写记数器(详细介绍)
2006/10/09 PHP
ThinkPHP中Session用法详解
2014/11/29 PHP
php控制文件下载速度的方法
2015/03/24 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
有一段有意思的代码-javascript现实多行信息
2007/08/26 Javascript
理解JavaScript的caller,callee,call,apply
2009/04/28 Javascript
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
2009/07/25 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
node.js express中app.param的用法详解
2017/07/16 Javascript
iView框架问题整理小结
2018/10/16 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
python 不关闭控制台的实现方法
2011/10/23 Python
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
详解python进行mp3格式判断
2016/12/23 Python
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
单位消防安全责任书
2014/07/23 职场文书
校运动会广播稿(100篇)
2014/09/12 职场文书
公司租房协议书范本
2014/10/08 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS