jQuery 判断图片是否加载完成方法汇总


Posted in Javascript onAugust 10, 2015

对于图片的处理,例如幻灯片播放、缩放等,都是依赖于在所有图片完成之后再进行操作。

今天来看下如何判断所有的图片加载完成,而在加载完成之前可以使用 loading 的 gif 图表示正在加载中。

一、普通方法

监听 img 的 load 方法,每 load 一张图片比较一次。关键代码如下:

var num = $img.length;

$imgs.load(function() {
  num--;
  if (num > 0) {
    return;
  }
  console.log('load compeleted');
}

二、使用 jQuery 中的 Deferred 对象

Deferred 对象是从 jQuery 1.5.0 版本开始引入的一个新功能,详细介绍可以见 官方文档。

简单的说,Deferred 对象就是jQuery的回调函数解决方案,它解决了如何处理耗时操作的问题, 对那些操作提供了更好的控制,以及统一的编程接口。

阮一峰有一篇文章是介绍 Deferred 对象的,写的比较详细,对于入门比较有用。

jQuery的deferred对象详解

在这里,我们用到了:

deferred.resolve(): Resolve a Deferred object and call any doneCallbacks with the given args.
deferred.when(): Provides a way to execute callback functions based on one or more objects, usually Deferred objects that represent asynchronous events.
deferred.done(): Add handlers to be called when the Deferred object is resolved.

关键代码:

var defereds = [];

$imgs.each(function() {
  var dfd = $.Deferred();

  $(this).load(dfd.resolve);
  defereds.push(dfd);
});
$.when.apply(null, defereds).done(function() {
  console.log('load compeleted');
});

基本思路:

每加载完一张图片 resolve(),when() 当所有的 Deferred 完成便执行 done()。

注: 因为 $.when 支持的参数是 $.when(dfd1, dfd2, dfd3, ...),所以我们这里使用了 apply 来接受数组参数。

complete判断图片是否加载了

感谢谷歌,找到了好使的方法,简单用法就是:

qim=new Image();//新建一个图片;
qim.src=$preload;//图片地址是你准备要加载的地址;
if(qim.complete){ $("#cxNfloor").html($filetoload);//qim.complete表示这个图片是否加载完毕了
}

后来又发现一个方法

$("").load(function(){...});

其中选择器是图片的id或class,function里面的方法就是回调函数,在图片加载完成后执行,但是我试验了很多,压根儿不是那么回事,正确的解决方法是:

//jquery的方式
$("#imageId").load(function(){
  alert("加载完成!");
});

有朋友说使用js是最好的,方法如下

document.getElementById("img2").onload=function(){}

在网上找到一段代码
例子

function loadImage(url, callback) {
 var img = new Image(); //创建一个Image对象,实现图片的预下载
 img.src = url;
 
 if(img.complete) { // 如果图片已经存在于浏览器缓存,直接调用回调函数
   callback.call(img);
   return; // 直接返回,不用再处理onload事件
  }
 img.onload = function () { //图片下载完毕时异步调用callback函数。
    callback.call(img);//将回调函数的this替换为Image对象
  };
};

下面是针对多个image的加载判断。

var imgdefereds=[];
$('img').each(function(){
 var dfd=$.Deferred();
 $(this).bind('load',function(){
 dfd.resolve();
 }).bind('error',function(){
 //图片加载错误,加入错误处理
 // dfd.resolve();
 })
 if(this.complete) setTimeout(function(){
 dfd.resolve();
 },1000);
 imgdefereds.push(dfd);
})
$.when.apply(null,imgdefereds).done(function(){
  callback();
});

  使用这种方法就可以避免window.onload的不足,不过代码稍显复杂 在性能方面比起window.onload经强很多。

Javascript 相关文章推荐
利用jquery写的左右轮播图特效
Feb 12 Javascript
jQuery中[attribute^=value]选择器用法实例
Dec 31 Javascript
javascript实现列表滚动的方法
Jul 30 Javascript
JS实现生成会变大变小的圆环实例
Aug 05 Javascript
js实现仿微博滚动显示信息的效果
Dec 21 Javascript
基于javascript bootstrap实现生日日期联动选择
Apr 07 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
May 17 Javascript
浅谈javascript中的事件冒泡和事件捕获
Dec 28 Javascript
JavaScript 跨域之POST实现方法
May 07 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
May 16 jQuery
vue自定义表单生成器form-create使用详解
Jul 19 Javascript
小程序登录之支付宝授权的实现示例
Dec 13 Javascript
javascript实现连续赋值
Aug 10 #Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
Aug 10 #Javascript
js中的内部属性与delete操作符介绍
Aug 10 #Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
Aug 09 #Javascript
javascript中对变量类型的判断方法
Aug 09 #Javascript
jquery仿百度百科底部浮动导航特效
Aug 08 #Javascript
jquery实现页面虚拟键盘特效
Aug 08 #Javascript
You might like
随时给自己贴的图片加文字的php水印
2007/03/16 PHP
PHP 动态随机生成验证码类代码
2010/04/09 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
PHP日志LOG类定义与用法示例
2018/09/06 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
javascript中input中readonly和disabled区别介绍
2012/10/23 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
2013/08/05 Javascript
详解JavaScript函数绑定
2013/08/18 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
浅谈Node.js 子进程与应用场景
2018/01/24 Javascript
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
简单了解JavaScript sort方法
2019/11/25 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
在Python中使用M2Crypto模块实现AES加密的教程
2015/04/08 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
2018/04/10 Python
python解决字符串倒序输出的问题
2018/06/25 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
Python字符串split及rsplit方法原理详解
2020/06/29 Python
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
2013/08/11 HTML / CSS
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
正宗的澳大利亚Ugg靴子零售商:UGG Express
2020/04/19 全球购物
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
党性观念心得体会
2014/09/03 职场文书
银行授权委托书范本
2014/10/04 职场文书
商务考察邀请函模板
2015/02/02 职场文书
新员工入职感想
2015/08/07 职场文书
同学会演讲稿
2019/04/02 职场文书