js图片预加载示例


Posted in Javascript onApril 30, 2014

js图片预加载简单示例

function loadImage(url, callback) {
    if(url!='null') {
        var img = new Image();
        img.src = url;
        if(img.complete) {
            callback(img);
        } else {
            img.onload = function(){
                img.onload = null;
                callback(img);
            } 
        }
    } 
}loadImage(pic_url,loadImage);

另一个详细详解示例

通过js操纵DOM很多情况下都是为了实现和当前页html元素的异步载入,我谈谈对Image对象的一些认识。
看个例子:

<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中“+”的陷阱深刻理解
Dec 04 Javascript
jQuery中noconflict函数的实现原理分解
Feb 03 Javascript
浅谈JavaScript数据类型及转换
Feb 28 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
Aug 24 Javascript
vue.js实现请求数据的方法示例
Feb 07 Javascript
三种方式实现瀑布流布局
Feb 10 Javascript
Vue实现按钮旋转和移动位置的实例代码
Aug 09 Javascript
vue 自定义指令自动获取文本框焦点的方法
Aug 25 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
Mar 08 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
Mar 11 Javascript
vue中datepicker的使用教程实例代码详解
Jul 08 Javascript
原生js实现日期选择插件
May 21 Javascript
javascript闭包入门示例
Apr 30 #Javascript
三种动态加载js的jquery实例代码另附去除js方法
Apr 30 #Javascript
js动态控制table的tr、td增加及删除的具体实现
Apr 30 #Javascript
js控制href内容的连接内容的变化示例
Apr 30 #Javascript
js函数定时器实现定时读取系统实时连接数
Apr 30 #Javascript
struts2+jquery组合验证注册用户是否存在
Apr 30 #Javascript
jquery实现的网页自动播放声音
Apr 30 #Javascript
You might like
PHP 写文本日志实现代码
2010/05/18 PHP
php addslashes 利用递归实现使用反斜线引用字符串
2013/08/05 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
原生JavaScript实现的简单省市县三级联动功能示例
2017/05/27 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
使用JS动态显示文本
2017/09/09 Javascript
Javacript中自定义的map.js  的方法
2017/11/26 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
使用vue的transition完成滑动过渡的示例代码
2018/06/25 Javascript
JavaScript事件对象深入详解
2018/12/30 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
[48:39]Ti4主赛事胜者组第一天 EG vs NEWBEE 2
2014/07/19 DOTA
使用SAE部署Python运行环境的教程
2015/05/05 Python
Django Highcharts制作图表
2016/08/27 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
2017/04/11 Python
Python切片操作实例分析
2018/03/16 Python
python使用matplotlib库生成随机漫步图
2018/08/27 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
有原因的手表:Flex Watches
2019/03/23 全球购物
FILA德国官方网站:来自意大利的体育和街头服饰品牌
2019/07/19 全球购物
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
小学三八妇女节活动方案
2014/03/16 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
2015年街道办事处工作总结
2015/05/22 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
php双向队列实例讲解
2021/11/17 PHP