var details_img = $(".details img"); //全部的图片 var img_len = details_img.length; details_img.on('load', function() { if (!--img_len) { if (detailScroll) { detailScroll.destroy(); detailScroll = null; } detailScroll = new IScroll('.bottom', { scrollbars: true, shrinkScrollbars: 'scale', snap: true }); } });
对于图片的处理,例如幻灯片播放、缩放等,都是依赖于在全部图片完成以后再进行操做。javascript
今天来看下如何判断全部的图片加载完成,而在加载完成以前能够使用 loading 的 gif 图表示正在加载中。html
监听 img 的 load 方法,每 load 一张图片比较一次。关键代码以下:java
var num = $img.length; $imgs.load(function() { num--; if (num > 0) { return; } console.log('load compeleted'); }
Deferred 对象是从 jQuery 1.5.0 版本开始引入的一个新功能,详细介绍能够见 官方文档。jquery
简单的说,Deferred 对象就是jQuery的回调函数解决方案,它解决了如何处理耗时操做的问题, 对那些操做提供了更好的控制,以及统一的编程接口。编程
阮一峰有一篇文章是介绍 Deferred 对象的,写的比较详细,对于入门比较有用。api
在这里,咱们用到了:app
关键代码:async
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()。ide
注: 由于 $.when 支持的参数是 $.when(dfd1, dfd2, dfd3, ...),因此咱们这里使用了 apply 来接受数组参数。