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打造TabPanel效果代码
May 22 Javascript
Extjs中ComboBox加载并赋初值的实现方法
Mar 22 Javascript
jQuery数据缓存功能的实现思路及简单模拟
May 27 Javascript
js实现单行文本向上滚动效果实例代码
Nov 28 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
Aug 15 Javascript
node.js中的http.request.end方法使用说明
Dec 10 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
Mar 06 Javascript
jquery获取select选中值的方法分析
Dec 22 Javascript
基于Phantomjs生成PDF的实现方法
Nov 07 Javascript
js+css实现打字效果
Jun 24 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
Sep 20 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
Oct 11 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简单实现MVC
2015/02/05 PHP
php数组比较实现查找连续数的方法
2015/07/29 PHP
laravel 解决多库下的DB::transaction()事务失效问题
2019/10/21 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
phpStorm2020 注册码
2020/09/17 PHP
基于jQuery的360图片展示实现代码
2012/06/14 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
2014/07/17 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
JS读写CSS样式的方法汇总
2016/08/16 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
vue使用axios实现文件上传进度的实时更新详解
2017/12/20 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
解决vuex刷新状态初始化的方法实现
2019/08/15 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
python 判断一个进程是否存在
2009/04/09 Python
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
在Python中使用第三方模块的教程
2015/04/27 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
python自动发邮件库yagmail的示例代码
2018/02/23 Python
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
django中url映射规则和服务端响应顺序的实现
2020/04/02 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
新西兰最大的在线设计师眼镜店:SmartBuyGlasses新西兰
2017/10/20 全球购物
如何处理简单的PHP错误
2015/10/14 面试题
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
PyQt QMainWindow的使用示例
2021/03/24 Python
2014厂务公开实施方案
2014/02/17 职场文书
写好自荐信需做到的5要点
2014/03/07 职场文书
投标承诺书范本
2014/03/27 职场文书
党员对照检查材料
2014/09/22 职场文书
python代码实现备忘录案例讲解
2021/07/26 Python