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 数组操作大全个人总结
Nov 13 Javascript
jQuery取id有.的值的方法
May 21 Javascript
JS实现焦点图轮播效果的方法详解
Dec 19 Javascript
原生js实现回复评论功能
Jan 18 Javascript
JavaScript队列的应用实例详解【经典数据结构】
Apr 12 Javascript
three.js中文文档学习之通过模块导入
Nov 20 Javascript
JS中精巧的自动柯里化实现方法
Dec 12 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
May 13 Javascript
angularJS实现不同视图同步刷新详解
Oct 09 Javascript
微信小程序结合mock.js实现后台模拟及调试
Mar 28 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
Sep 06 Javascript
微信小程序手动添加收货地址省市区联动
May 18 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基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
php微信扫码支付 php公众号支付
2019/03/24 PHP
javascript SocialHistory 检查访问者是否访问过某站点
2008/08/02 Javascript
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
jQuery实现表格行上移下移和置顶的方法
2015/05/22 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
原生JS仿QQ阅读点击展开、收起效果
2017/03/08 Javascript
详解Node.js项目APM监控之New Relic
2017/05/12 Javascript
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
javascript执行上下文、变量对象实例分析
2020/04/25 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
pandas数据分组和聚合操作方法
2018/04/11 Python
Python利用splinter实现浏览器自动化操作方法
2018/05/11 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
python两个list[]相加的实现方法
2020/09/23 Python
python爬虫分布式获取数据的实例方法
2020/11/26 Python
C#的几个面试问题
2016/05/22 面试题
经典公益广告词
2014/03/13 职场文书
平安家庭示范户事迹
2014/06/02 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
2015年度保密工作总结
2015/04/24 职场文书
2015年教师节感言
2015/08/03 职场文书