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 相关文章推荐
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
Oct 26 Javascript
JavaScript常用全局属性与方法记录积累
Jul 03 Javascript
jQuery客户端分页实例代码
Nov 18 Javascript
form表单action提交的js部分与html部分
Jan 07 Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
Oct 29 Javascript
必备的JS调试技巧汇总
Jul 20 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
Jan 22 Javascript
layui表格实现代码
May 20 Javascript
vue2.0.js的多级联动选择器实现方法
Feb 09 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
May 03 Javascript
vue引用js文件的多种方式(推荐)
May 17 Javascript
vue实现路由懒加载的3种方法示例
Sep 01 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
Terran热键控制
2020/03/14 星际争霸
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
JS 文字符串转换unicode编码函数
2009/05/30 Javascript
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
2013/03/27 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
javascript实现自动填写表单实例简析
2015/12/02 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
vue中父子组件注意事项,传值及slot应用技巧
2018/05/09 Javascript
koa中间件核心(koa-compose)源码解读分析
2020/06/15 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
Python线程指南详细介绍
2017/01/05 Python
python中日志logging模块的性能及多进程详解
2017/07/18 Python
Python文件的读写和异常代码示例
2017/10/31 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
在Python中居然可以定义两个同名通参数的函数
2019/01/31 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
python简单实现9宫格图片实例
2020/09/03 Python
python跨文件使用全局变量的实现
2020/11/17 Python
基础的CSS3弹性盒Flexbox布局使用实例
2016/04/08 HTML / CSS
来自世界各地的优质葡萄酒:VineShop24
2018/07/09 全球购物
民主评议党员自我评议范文2014
2014/09/26 职场文书
小学老师对学生的评语
2014/12/29 职场文书
结婚保证书(三从四德)
2015/02/26 职场文书
联谊活动总结范文
2015/05/09 职场文书
mysql5.7使用binlog 恢复数据的方法
2021/06/03 MySQL
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL