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 31 Javascript
JavaScript中的undefined学习总结
Nov 30 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
Dec 19 Javascript
javascript中alert()与console.log()的区别
Aug 26 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
Jun 06 Javascript
JS 实现Base64编码与解码实例详解
Nov 07 Javascript
详解微信小程序 相对定位和绝对定位
May 11 Javascript
javascript帧动画(实例讲解)
Sep 02 Javascript
vue中父子组件注意事项,传值及slot应用技巧
May 09 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
Aug 13 Javascript
通过扫小程序码实现网站登陆功能
Aug 22 Javascript
详解vue组件之间的通信
Aug 30 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 空格,换行,跳格使用说明
2009/12/18 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
PHP设计模式之适配器模式原理与用法分析
2018/04/25 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
javascript控制台详解
2015/06/25 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
2019/09/03 jQuery
一篇文章让你搞懂JavaScript 原型和原型链
2020/11/23 Javascript
python获取外网ip地址的方法总结
2015/07/02 Python
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
Python读取Word(.docx)正文信息的方法
2018/03/15 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
全球最大的网上自行车商店:Chain Reaction Cycles
2016/12/02 全球购物
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
简历中自我评价分享
2013/10/09 职场文书
技术总监的工作职责
2013/11/13 职场文书
怎样填写就业意向
2014/04/02 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
乡镇安全生产目标责任书
2014/07/23 职场文书
庆国庆活动总结
2014/08/28 职场文书
村干部任职承诺书
2015/01/21 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
JavaScript 数组去重详解
2021/09/15 Javascript
asyncio异步编程之Task对象详解
2022/03/13 Python
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript