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 相关文章推荐
RGB颜色值转HTML十六进制(HEX)代码的JS函数
Apr 25 Javascript
利用jQuery 实现GridView异步排序、分页的代码
Feb 06 Javascript
jQuery实现平滑滚动页面到指定锚点链接的方法
Jul 15 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
Nov 04 Javascript
Javascript中的Prototype到底是什么
Feb 16 Javascript
全面解析多种Bootstrap图片轮播效果
May 27 Javascript
JS仿百度自动下拉框模糊匹配提示
Jul 25 Javascript
简单实现js选项卡切换效果
Feb 09 Javascript
javascript设计模式之单体模式学习笔记
Feb 15 Javascript
angular2路由之routerLinkActive指令【推荐】
May 30 Javascript
使用electron将vue-cli项目打包成exe的方法
Sep 29 Javascript
Nuxt.js 静态资源和打包的操作
Nov 06 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
做一个有下拉功能的留言版
2006/10/09 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
php表单请求获得数据求和示例
2014/05/15 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
2014/06/23 Javascript
jQuery寻找n以内完全数的方法
2015/06/24 Javascript
jQuery实现购物车表单自动结算效果实例
2015/08/10 Javascript
js数组常用操作方法小结(增加,删除,合并,分割等)
2016/08/02 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
JS正则表达式常见用法实例详解
2018/06/19 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
js对象属性名驼峰式转下划线的实例代码
2020/09/17 Javascript
Python编程中的for循环语句学习教程
2015/10/14 Python
Python在图片中添加文字的两种方法
2017/04/29 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
2020/03/18 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
儿科护理实习自我鉴定
2013/09/19 职场文书
老师自我鉴定范文
2013/12/25 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
2014年妇幼保健工作总结
2014/12/08 职场文书
玄武湖导游词
2015/02/05 职场文书
mysql知识点整理
2021/04/05 MySQL
Python OpenCV 彩色与灰度图像的转换实现
2021/06/05 Python
css弧边选项卡的项目实践
2023/05/07 HTML / CSS