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 相关文章推荐
JavaScript使用prototype定义对象类型(转)[
Dec 22 Javascript
jQuery EasyUI API 中文文档 - NumberBox数字框
Oct 13 Javascript
js 判断控件获得焦点的示例代码
Mar 04 Javascript
js实现格式化金额,字符,时间的方法
Feb 26 Javascript
浅析Ajax语法
Dec 05 Javascript
Bootstrap php制作动态分页标签
Dec 23 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
Jan 05 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
Feb 27 Javascript
BootStrap表单控件之文本域textarea
May 23 Javascript
vue数字类型过滤器的示例代码
Sep 07 Javascript
angular2 NgModel模块的具体使用方法
Apr 10 Javascript
微信小程序传值以及获取值方法的详解
Apr 29 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
自己做矿石收音机
2021/03/02 无线电
解析PHP处理换行符的问题 \r\n
2013/06/13 PHP
通过php删除xml文档内容的方法
2015/01/23 PHP
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
Extjs入门之动态加载树代码
2010/04/09 Javascript
JQuery防止退格键网页后退的实现代码
2012/03/23 Javascript
JS 控件事件小结
2012/10/31 Javascript
JavaScript使用function定义对象并调用的方法
2015/03/23 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
JS实现自动变化的导航菜单效果代码
2015/09/09 Javascript
基于JavaScript代码实现pc与手机之间的跳转
2015/12/23 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
Vue实现点击当前行变色
2020/12/14 Vue.js
[03:40]2014DOTA2国际邀请赛 B神专访:躲箭真的很难
2014/07/13 DOTA
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
2015年元旦文艺汇演主持词
2014/03/26 职场文书
优秀管理者事迹材料
2014/05/22 职场文书
秋季校运会广播稿100字
2014/09/18 职场文书
反对四风问题自我剖析材料
2014/09/29 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
反邪教学习心得体会
2016/01/15 职场文书
2016学习医德医风心得体会
2016/01/25 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
MySQL表字段时间设置默认值
2021/05/13 MySQL
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android
delete in子查询不走索引问题分析
2022/07/07 MySQL