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 相关文章推荐
弹出广告特效代码(一个IP只弹出一次)
May 11 Javascript
JQuery-tableDnD 拖拽的基本使用介绍
Jul 04 Javascript
jquery 定位input元素的几种方法小结
Jul 28 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
Jul 27 Javascript
基于bootstrap3和jquery的分页插件
Jul 31 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
Mar 16 Javascript
jquery实现全选、不选、反选的两种方法
Sep 06 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
Dec 04 Javascript
深入理解React高阶组件
Sep 28 Javascript
angular 实时监听input框value值的变化触发函数方法
Aug 31 Javascript
解决vue-cli项目webpack打包后iconfont文件路径的问题
Sep 01 Javascript
js实现点击生成随机div
Jan 16 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 接口类与抽象类的实际作用
2009/11/26 PHP
基于curl数据采集之正则处理函数get_matches的使用
2013/04/28 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
JavaScript 继承的实现
2009/07/09 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
2012/12/15 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
js实现自动图片轮播代码
2017/03/22 Javascript
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
深入理解Angularjs 脏值检测
2018/10/12 Javascript
javascript数据类型中的一些小知识点(推荐)
2019/04/18 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
使用Python操作Elasticsearch数据索引的教程
2015/04/08 Python
如何在Django项目中引入静态文件
2019/07/26 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
英国独特的时尚和生活方式品牌:JOY
2018/03/17 全球购物
简述数组与指针的区别
2014/01/02 面试题
学生档案自我鉴定
2013/10/07 职场文书
商场中秋节广播稿
2014/01/17 职场文书
英语一分钟演讲稿
2014/04/29 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
Python实现随机生成迷宫并自动寻路
2021/06/13 Python
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技
Vue的生命周期一起来看看
2022/02/24 Vue.js