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 相关文章推荐
页面加载完毕后滚动条自动滚动一定位置
Feb 20 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
Nov 13 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
Aug 28 Javascript
js实现瀑布流的三种方式比较
Jun 28 Javascript
ionic实现滑动的三种方式
Aug 27 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
Sep 12 Javascript
vue使用v-for实现hover点击效果
Sep 29 Javascript
js中call()和apply()改变指针问题的讲解
Jan 17 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
Dec 10 Javascript
使用uni-app开发微信小程序的实现
Dec 13 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
Aug 14 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
Oct 22 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
2个比较经典的PHP加密解密函数分享
2014/07/01 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
php源码之将图片转化为data/base64数据流实例详解
2016/11/27 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
vue-lazyload图片延迟加载插件的实例讲解
2018/02/09 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
pyside写ui界面入门示例
2014/01/22 Python
分享一个常用的Python模拟登陆类
2015/03/29 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
python爬虫使用cookie登录详解
2017/12/27 Python
python 日志增量抓取实现方法
2018/04/28 Python
python 判断参数为Nonetype类型或空的实例
2018/10/30 Python
Python类的继承用法示例
2019/01/31 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
GWT的应用有哪两种部署模式
2012/12/21 面试题
国贸专业个人求职信分享
2013/12/04 职场文书
致长跑运动员加油稿
2014/02/20 职场文书
司机岗位职责说明书
2014/07/29 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
工程部岗位职责
2015/02/10 职场文书
离婚起诉书范本
2015/05/18 职场文书
同意报考证明
2015/06/17 职场文书
公务员学习中国梦心得体会
2016/01/05 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python
Tomcat用户管理的优化配置详解
2022/03/31 Servers