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 27 Javascript
js可突破windows弹退效果代码
Aug 09 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 Javascript
js实现表格字段排序
Feb 19 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
Oct 10 Javascript
原生js封装二级城市下拉列表的实现代码
Jun 16 Javascript
Vue.js的动态组件模板的实现
Nov 26 Javascript
vue基于viewer实现的图片查看器功能
Apr 12 Javascript
微信小程序实现侧边分类栏
Oct 21 Javascript
基于javascript处理nginx请求过程详解
Jul 07 Javascript
jQuery编写QQ简易聊天框
Aug 27 jQuery
quickjs 封装 JavaScript 沙箱详情
Nov 02 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数组(array)输出的三种形式详解
2013/06/05 PHP
php取得字符串首字母的方法
2015/03/25 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
prototype与__proto__区别详细介绍
2017/01/09 Javascript
JS实现数组去重复值的方法示例
2017/02/18 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
Angularjs自定义指令实现分页插件(DEMO)
2017/09/16 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
利用python如何在前程无忧高效投递简历
2019/05/07 Python
python在openstreetmap地图上绘制路线图的实现
2019/07/11 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
IronPython连接MySQL的方法步骤
2019/12/27 Python
Python实现屏幕录制功能的代码
2020/03/02 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
如何理解Python中包的引入
2020/05/29 Python
Python 实现一个计时器
2020/07/28 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
中国电视购物:快乐购
2017/02/04 全球购物
列车长先进事迹材料
2014/01/25 职场文书
党组织结对共建协议书
2016/03/23 职场文书
导游词之苏州阳澄湖
2019/11/15 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python