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 相关文章推荐
关于图片的预加载过程中隐藏未知的
Dec 19 Javascript
JS禁用浏览器退格键实现思路及代码
Oct 29 Javascript
关闭时刷新父窗口两种方法
May 07 Javascript
运用jQuery定时器的原理实现banner图片切换
Oct 22 Javascript
Vue.JS入门教程之处理表单
Dec 01 Javascript
Javascript之深入浅出prototype
Feb 06 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
Aug 14 Javascript
优雅的elementUI table单元格可编辑实现方法详解
Dec 23 Javascript
深入了解JavaScript 防抖和节流
Sep 12 Javascript
微信小程序canvas截取任意形状的实现代码
Jan 13 Javascript
vue2.x 对象劫持的原理实现
Apr 19 Javascript
微信小程序开发数据缓存基础知识辨析及运用实例详解
Nov 06 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+jQuery制作的列表分页的功能模块
2014/10/14 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
利用onresize使得div可以随着屏幕大小而自适应的代码
2010/01/15 Javascript
javascript forEach通用循环遍历方法
2010/10/11 Javascript
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
js中的string.format函数代码
2020/08/11 Javascript
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
js函数调用常用方法详解
2012/12/03 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
2014/01/26 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
2016/08/25 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
2016/12/19 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
jquery判断滚动条距离顶部的距离方法
2018/09/05 jQuery
Angular6项目打包优化的实现方法
2019/12/15 Javascript
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
[46:50]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python获取脚本所在目录的正确方法
2014/04/15 Python
Python首次安装后运行报错(0xc000007b)的解决方法
2016/10/18 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
总经理助理职责
2014/02/04 职场文书
六五普法宣传标语
2014/10/06 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
小学班级口号大全
2015/12/25 职场文书
Node.js实现断点续传
2021/06/23 Javascript