JavaScript & jQuery完美判断图片是否加载完毕


Posted in Javascript onJanuary 08, 2017

众所周知,常见瀑布流当鼠标滚动到浏览器底部的时候,就会发起一个ajax的请求。在服务端生成item列表后,通过 js append到相应的div里边。

看起来很简单的样子,关键问题就出在图片的加载问题上,图片一般都放在服务器上,通过http下载到客户端。

例如我的图片地址:

http://xxx.xxx.com/sc/item/cover/9-4352-c400.jpg

而图片下载到本地是需要一定时间的(网速快的路过)。当图片还没有下载完的时候,使用js获取到元素的宽高将会是0

有的同学说了我使用jquery的ready不就好了。如下

$(document).ready(function(){
 // 在这里写你的代码...
});

如果这么简单就好了,我这里就说下ready与window.onload的区别。

jquery的ready只是dom的结构加载完毕,便视为加载完成。(缺点是图片没有加载完毕,宽高为0,程序出错)

js的window.onload是指dom的生成和资源的加载,比如flash、图片完全加载出来后才执行onload。(缺点就是当某一张图片很大的时候,岂不阻止了其它js的正常执行)

知道了他们的区别后,我们再来谈谈如何避免错误和选择性使用。

如果你进行了百度,很多人会告诉你。

这样:

$('img').load(function(){
 // 加载完成 
});

好像很强大的样子,其实不然,他的缺点是每加载一张图片,回调函数就执行一次。好吧太烦了,我只想全部加载完走一次就可以了。当然可以,你可以进行修改如下:

va imgNum=$('img').length;
$('img').load(function(){
 if(!--imgNum){
 // 加载完成
 }
});

这样总可以了吧,我加载一张,就用图片总数去减一,减到0我就加载完毕。看起来很完美,前提是你没遇到IE。

IE的图片总是从缓存文件里去拿,这就造成load方法根本就不执行,只有是新图片才会走load

服了吧?继续往下看。

或者是这样:

document.getElementById('img').onload=function(){
 // 加载完成 
};

看我原生代码一统天下,实际上效果甚微,一次只能处理一个你准备写多少个document,有人说我可以用循环去绑定,经过我测试貌似根本没效果。

还是一笑而过吧。看看我的最终解决方案(兼容:谷歌&火狐&IE)

利用图片没有加载完成的时候,宽高为0。我们很容易判断图片的一个加载情况。如下:

var t_img; // 定时器
var isLoad = true; // 控制变量
// 判断图片加载状况,加载完成后回调
isImgLoad(function(){
 // 加载完成
});
// 判断图片加载的函数
function isImgLoad(callback){
 // 注意我的图片类名都是cover,因为我只需要处理cover。其它图片可以不管。
 // 查找所有封面图,迭代处理
 $('.cover').each(function(){
 // 找到为0就将isLoad设为false,并退出each
 if(this.height === 0){
 isLoad = false;
 return false;
 }
 });
 // 为true,没有发现为0的。加载完毕
 if(isLoad){
 clearTimeout(t_img); // 清除定时器
 // 回调函数
 callback();
 // 为false,因为找到了没有加载完成的图,将调用定时器递归
 }else{
 isLoad = true;
 t_img = setTimeout(function(){
 isImgLoad(callback); // 递归扫描
 },500); // 我这里设置的是500毫秒就扫描一次,可以自己调整
 }
}

看了我的代码,你是否也有了自己的想法呢?

 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
Apr 01 Javascript
JQuery 操作select标签实现代码
May 14 Javascript
javascript图像处理—仿射变换深度理解
Jan 16 Javascript
举例简介AngularJS的内部语言环境
Jun 17 Javascript
jquery实现的代替传统checkbox样式插件
Jun 19 Javascript
js判断浏览器类型及设备(移动页面开发)
Jul 30 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
Oct 08 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
Nov 30 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
Apr 21 Javascript
angular+ionic 的app上拉加载更新数据实现方法
Jan 16 Javascript
Postman环境变量全局变量使用方法详解
Aug 13 Javascript
js实现页面导航层级指示效果
Aug 25 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
Jan 08 #Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
Jan 08 #Javascript
Javascript 实现计算器时间功能详解及实例(二)
Jan 08 #Javascript
JS 实现计算器详解及实例代码(一)
Jan 08 #Javascript
详解百度百科目录导航树小插件
Jan 08 #Javascript
Three.js基础部分学习
Jan 08 #Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
Jan 08 #Javascript
You might like
微信扫描二维码登录网站代码示例
2013/12/30 PHP
php操作xml入门之cdata区段
2015/01/23 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
2015/04/06 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
2017/01/03 Javascript
express如何使用session与cookie的方法
2018/01/30 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
vue.js中npm安装教程图解
2018/04/10 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
2018/09/13 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
python生成器表达式和列表解析
2016/03/10 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
2016/06/29 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
Django框架中间件(Middleware)用法实例分析
2019/05/24 Python
pytorch 实现打印模型的参数值
2019/12/30 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
django列表筛选功能的实现代码
2020/03/27 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
django数据模型中null和blank的区别说明
2020/09/02 Python
详解Python中import机制
2020/09/11 Python
Python提取视频中图片的示例(按帧、按秒)
2020/10/22 Python
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
Cinque网上商店:德国服装品牌
2019/03/17 全球购物
学校后勤人员职责
2013/12/27 职场文书
2014年个人售房协议书
2014/10/30 职场文书
关于长城的导游词
2015/01/30 职场文书
三八妇女节新闻稿
2015/07/17 职场文书
浅谈sql_@SelectProvider及使用注意说明
2021/08/04 Java/Android