有时候我们在前端开发工作中为了获取图片的信息, 需要在图片加载完成后才可以正确的获取到图片的大小尺寸, 并且执行相应的回调函数使图片产生某种显示效果. 下面本篇主要整理了几种常见的 jQuery 判断图片加载完成的方法.
对于图片的处理, 例如幻灯片播放, 缩放等, 都是依赖于在所有图片完成之后再进行操作.
今天来看下如何判断所有的图片加载完成, 而在加载完成之前可以使用 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 的回调函数解决方案, 它解决了如何处理耗时操作的问题, 对那些操作提供了更好的控制, 以及统一的编程接口.
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();
- });
使用这种方法就可以避免 Windows.onload 的不足, 不过代码稍显复杂 在性能方面比起 Windows.onload 经强很多.
来源: http://www.css88.com/qa/jquery/15471.html