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 相关文章推荐
基于jQuery UI CSS Framework开发Widget的经验
Aug 21 Javascript
js 页面关闭前的出现提示的实现代码
May 25 Javascript
通过jQuery源码学习javascript(二)
Dec 27 Javascript
Tab切换组件(选项卡功能)实例代码
Nov 21 Javascript
解决json日期格式问题的3种方法
Feb 02 Javascript
jQuery插件jFade实现鼠标经过的图片高亮其它变暗
Mar 14 Javascript
基于jQuery通过jQuery.form.js插件实现异步上传
Dec 13 Javascript
Vue.js组件通信的几种姿势
Oct 23 Javascript
webpack中的热刷新与热加载的区别
Apr 09 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
Apr 20 Javascript
node读写Excel操作实例分析
Nov 06 Javascript
利用promise及参数解构封装ajax请求的方法
Mar 24 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中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
2016/12/15 PHP
Convert Seconds To Hours
2007/06/16 Javascript
由document.body和document.documentElement想到的
2009/04/13 Javascript
JavaScript 学习笔记(十二) dom
2010/01/21 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
jquery左右全屏大尺寸多图滑动效果代码分享
2015/08/28 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
2016/09/14 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
jQuery实现表格奇偶行显示不同背景色 就这么简单
2017/03/13 Javascript
JavaScript 性能提升之路(推荐)
2019/04/10 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
python实现划词翻译
2020/04/23 Python
win7安装python生成随机数代码分享
2013/12/27 Python
python生成随机密码或随机字符串的方法
2015/07/03 Python
Python编程中归并排序算法的实现步骤详解
2016/05/04 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
2020/02/26 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
用Python制作mini翻译器的实现示例
2020/08/17 Python
德国排名第一的主题公园门票网站:Attraction Tickets Direct
2019/09/09 全球购物
明星员工获奖感言
2014/08/14 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
学校法制宣传日活动总结
2014/11/01 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
业务员岗位职责
2015/02/03 职场文书
土木工程毕业答辩开场白
2015/05/29 职场文书
董事长年会致辞
2015/07/29 职场文书
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python
微软发布Windows 11今年最大更新22H2(附 ISO 镜像官方下载)
2022/09/23 数码科技