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 相关文章推荐
JQuery1.6 使用方法三
Nov 23 Javascript
javascript禁用键盘功能键让右击及其他键无效
Oct 09 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
Dec 04 Javascript
浅谈 jQuery 事件源码定位问题
Jun 18 Javascript
JS制作简单的三级联动
Mar 18 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
Jul 17 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
Aug 05 Javascript
解决wx.onMenuShareTimeline出现的问题
Aug 16 Javascript
jquery.validate表单验证插件使用方法解析
Nov 07 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
Dec 31 Javascript
详解EasyUi控件中的Datagrid
Aug 23 Javascript
在vue组件中使用axios的方法
Mar 16 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
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
php面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
QQ登录 PHP OAuth示例代码
2011/07/20 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
php使用PDO操作MySQL数据库实例
2014/12/30 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
JavaScript全局函数使用简单说明
2011/03/11 Javascript
真正的JQuery.ajax传递中文参数的解决方法
2011/05/28 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
JavaScript实现select添加option
2015/07/03 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
浅析vue-router中params和query的区别
2019/12/24 Javascript
Vite和Vue CLI的优劣
2021/01/30 Vue.js
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
实例讲解python中的协程
2018/10/08 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
Python实现自动访问网页的例子
2020/02/21 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
学校采购员岗位职责
2014/01/02 职场文书
安全生产承诺书
2014/03/26 职场文书
4s店销售经理岗位职责
2014/07/19 职场文书
群众路线个人自我剖析材料
2014/10/07 职场文书
舞出我人生观后感
2015/06/16 职场文书
2016党员干部政治学习心得体会
2016/01/23 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL
CentOS MySql8 远程连接实战
2022/04/19 MySQL
Python自动化实战之接口请求的实现
2022/05/30 Python