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性能陷阱小结(附实例说明)
Dec 28 Javascript
file控件选择上传文件确定后触发的js事件是哪个
Mar 17 Javascript
JQuery悬停控制图片轮播——代码简单
Aug 05 Javascript
如何用angularjs制作一个完整的表格
Jan 21 Javascript
jquery中validate与form插件提交的方式小结
Mar 26 Javascript
jQuery实现遮罩层登录对话框
Dec 29 Javascript
vue-cli实现多页面多路由的示例代码
Jan 30 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
Sep 29 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
Oct 10 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
Feb 19 jQuery
浅谈JavaScript_DOM学习篇_图片切换小案例
Mar 19 Javascript
vue 项目引入echarts 添加点击事件操作
Sep 09 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 加密/解密函数 dencrypt(动态密文,带压缩功能,支持中文)
2009/01/30 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
PHP实现判断数组是一维、二维或几维的方法
2017/02/06 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
vue多级多选菜单组件开发
2020/09/08 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
浅谈Angular4中常用管道
2017/09/27 Javascript
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
微信小程序实现左右联动的实战记录
2018/07/05 Javascript
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
图文详解vue框架安装步骤
2019/02/12 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
2019/08/27 jQuery
解决vue elementUI 使用el-select 时 change事件的触发问题
2020/11/17 Vue.js
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
Python使用django搭建web开发环境
2017/06/09 Python
python正则实现计算器功能
2017/12/14 Python
基于Python函数和变量名解析
2019/07/19 Python
Pytorch 卷积中的 Input Shape用法
2020/06/29 Python
通过css3动画和opacity透明度实现呼吸灯效果
2019/08/09 HTML / CSS
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
DOUGLAS波兰:在线销售香水和化妆品
2020/07/05 全球购物
北京华建集团SQL面试题
2014/06/03 面试题
加多宝凉茶广告词
2014/03/18 职场文书
个人典型事迹材料
2014/12/30 职场文书
刮痧观后感
2015/06/05 职场文书
追悼会悼词大全
2015/06/23 职场文书
护理自荐信
2019/05/14 职场文书
Python图片处理之图片裁剪教程
2021/05/27 Python
Python爬虫实战之爬取携程评论
2021/06/02 Python
如何给HttpServletRequest增加消息头
2021/06/30 Java/Android