专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

jQuery 判断图片是否加载完成方法汇总

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 0:42:53       共计:3604 浏览
有时候我们在前端开发工作中为了获取图片的信息,需要在图片加载完成后才可以正确的获取到图片的大小尺寸,并且执行相应的回调函数使图片产生某种显示效果。本文主要整理了几种常见的jquery判断图片加载完成时的方法

对于图片的处理,例如幻灯片播放、缩放等,都是依赖于在所有图片完成之后再进行操作。

今天来看下如何判断所有的图片加载完成,而在加载完成之前可以使用 loading 的 gif 图表示正在加载中。

一、普通方法

监听 img 的 load 方法,每 load 一张图片比较一次。关键代码如下:

1 2 3 4 5 6 7 8 9 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.

关键代码:

1 2 3 4 5 6 7 8 9 10 11 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判断图片是否加载了

感谢谷歌,找到了好使的方法,简单用法就是:

1 2 3 4 qim=new Image();//新建一个图片; qim.src=$preload;//图片地址是你准备要加载的地址; if(qim.complete){ $("#cxNfloor").html($filetoload);//qim.complete表示这个图片是否加载完毕了 }

后来又发现一个方法

1 $("").load(function(){...});

其中选择器是图片的id或class,function里面的方法就是回调函数,在图片加载完成后执行,但是我试验了很多,压根儿不是那么回事,正确的解决方法是:

1 2 3 4 //jquery的方式 $("#imageId").load(function(){   alert("加载完成!"); });

有朋友说使用js是最好的,方法如下

复制代码 代码如下:
document.getElementById("img2").onload=function(){}

在网上找到一段代码
例子

1 2 3 4 5 6 7 8 9 10 11 12 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的加载判断。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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经强很多。

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:Asp.NET MVC 中使用 SignalR 实现推送功能 | ·下一条:jquery 阻止冒泡 点击弹出层自身以外的任意位置,关闭弹出层

Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有