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 相关文章推荐
Convert Seconds To Hours
Jun 16 Javascript
javascript基本包装类型介绍
Apr 10 Javascript
jQuery手动点击实现图片轮播特效
Apr 20 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
May 03 Javascript
深入分析javascript中的错误处理机制
Jul 17 Javascript
10分钟上手vue-cli 3.0 入门介绍
Apr 04 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
Oct 26 jQuery
vue-cli3 karma单元测试的实现
Jan 18 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
Apr 26 Javascript
简单学习5种处理Vue.js异常的方法
Jun 17 Javascript
js设计模式之单例模式原理与用法详解
Aug 15 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
Apr 22 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弹出对话框实现重定向代码
2014/01/23 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
JavaScript基本对象
2007/01/11 Javascript
js 禁止选择功能实现代码(兼容IE/Firefox)
2010/04/23 Javascript
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
javascript表单控件实例讲解
2016/09/13 Javascript
easyui取消表单实时验证,提交时统一验证的简单实例
2016/11/07 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
Vue路由切换时的左滑和右滑效果示例
2018/05/29 Javascript
对于防止按钮重复点击的尝试详解
2019/04/22 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
跟老齐学Python之??碌某?? target=
2014/09/12 Python
简介Python的collections模块中defaultdict类型的用法
2016/07/07 Python
Python实现邮件的批量发送的示例代码
2018/01/23 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
2018/09/02 Python
python解析xml简单示例
2019/06/21 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
在python中使用nohup命令说明
2020/04/16 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
印度在线杂货店:bigbasket
2018/08/23 全球购物
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
素质教育标语
2014/06/27 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
python - timeit 时间模块
2021/04/06 Python
Pyqt5将多个类组合在一个界面显示的完整示例
2021/09/04 Python