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 相关文章推荐
JS的千分位算法实现思路
Jul 31 Javascript
js选项卡的实现方法
Feb 09 Javascript
使用coffeescript编写node.js项目的方法汇总
Aug 05 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
Jan 25 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
Mar 11 Javascript
javascript弹出窗口中增加确定取消按钮
Jun 24 Javascript
three.js中3D视野的缩放实现代码
Nov 16 Javascript
LayerClose弹窗关闭刷新方法
Aug 17 Javascript
解决element UI 自定义传参的问题
Aug 22 Javascript
Vue axios 将传递的json数据转为form data的例子
Oct 29 Javascript
解决vue admin element noCache设置无效的问题
Nov 12 Javascript
react中props 的使用及进行限制的方法
Apr 28 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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
PHP 文件扩展名 获取函数
2009/06/03 PHP
php 安全过滤函数代码
2011/05/07 PHP
提高PHP编程效率的方法
2013/11/07 PHP
PHP全局变量与超级全局变量区别分析
2016/04/01 PHP
PHP fclose函数用法总结
2019/02/15 PHP
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
可以将word转成html的js代码
2010/04/11 Javascript
基于jQuery判断两个元素是否有重叠部分的代码
2012/07/25 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
JS实现的Select三级下拉菜单代码
2015/08/20 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
详解Angualr 组件间通信
2017/01/21 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
python读写二进制文件的方法
2015/05/09 Python
Python装饰器实现几类验证功能做法实例
2017/05/18 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
简单了解python单例模式的几种写法
2019/07/01 Python
python如何提取英语pdf内容并翻译
2020/03/03 Python
Python3获取cookie常用三种方案
2020/10/05 Python
HTML实现代码雨源码及效果示例
2020/02/25 HTML / CSS
旧时光糖果:Old Time Candy
2018/02/05 全球购物
小学生节约用水倡议书
2014/05/15 职场文书
加班费申请报告
2015/05/15 职场文书
甜美蛋糕店的创业计划书模板,拿来即用!
2019/08/21 职场文书
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android