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 相关文章推荐
Script的加载方法小结
Jan 12 Javascript
jQuery下的动画处理总结
Oct 10 Javascript
使用text方法获取Html元素文本信息示例
Sep 01 Javascript
使用jquery制作弹出框效果
Apr 03 Javascript
详解AngularJS实现表单验证
Dec 10 Javascript
jQuery 移动端artEditor富文本编辑器
Jan 11 Javascript
不定义JQuery插件 不要说会JQuery
Mar 07 Javascript
jquery 中toggle的2种用法详解(推荐)
Sep 02 Javascript
Vue + Vue-router 同名路由切换数据不更新的方法
Nov 20 Javascript
vue如何根据网站路由判断页面主题色详解
Nov 02 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
Nov 02 Javascript
测量JavaScript函数的性能各种方式对比
Apr 27 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检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
jquery-tips悬浮提示插件分享
2015/07/31 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
jquery.tagsinput.js实现记录checkbox勾选的顺序
2019/09/21 jQuery
vue实现鼠标移过出现下拉二级菜单功能
2019/12/12 Javascript
JS实现超级好看的鼠标小尾巴特效
2020/12/01 Javascript
python strip()函数 介绍
2013/05/24 Python
python3 pillow生成简单验证码图片的示例
2017/09/19 Python
python根据url地址下载小文件的实例
2018/12/18 Python
python3 下载网络图片代码实例
2019/08/27 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
Python中bisect的用法及示例详解
2020/07/20 Python
Python设计密码强度校验程序
2020/07/30 Python
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
物业管理求职自荐信
2013/09/25 职场文书
一年级小学生评语
2014/04/22 职场文书
2014年新生军训方案
2014/05/01 职场文书
商业项目策划方案
2014/06/05 职场文书
小学学校评估方案
2014/06/08 职场文书
本科毕业生应聘求职信
2014/07/06 职场文书
给病人的慰问信
2015/03/23 职场文书
2015年学校财务工作总结
2015/05/19 职场文书
PHP 技巧 * SVG 保存为图片(分享图生成)
2021/04/02 PHP
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL