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 相关文章推荐
jquery select(列表)的操作(取值/赋值)
Mar 16 Javascript
解析javascript系统错误:-1072896658的解决办法
Jul 08 Javascript
javascript实现获取cookie过期时间的变通方法
Aug 14 Javascript
JS实现的论坛Ajax打分效果完整实例
Oct 31 Javascript
基于JavaScript如何制作遮罩层对话框
Jan 26 Javascript
javascript实现随机生成DIV背景色
Jun 20 Javascript
JS控制文本域只读或可写属性的方法
Jun 24 Javascript
jQuery EasyUI菜单与按钮详解
Jul 13 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
Oct 27 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
Jan 10 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
Feb 28 jQuery
vue中使用props传值的方法
May 08 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
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
php截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
thinkPHP中volist标签用法示例
2016/12/06 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
node.js中的console.trace方法使用说明
2014/12/09 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
javascript拖拽应用实例(二)
2016/03/25 Javascript
JavaScript数组方法总结分析
2016/05/06 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
浅述节点的创建及常见功能的实现
2016/12/15 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
2019/04/09 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
Python开发的实用计算器完整实例
2017/05/10 Python
在Windows中设置Python环境变量的实例讲解
2018/04/28 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
2018/09/17 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
python3 kubernetes api的使用示例
2021/01/12 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
HTML5 embed 标签使用方法介绍
2013/08/13 HTML / CSS
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
施华洛世奇意大利官网:SWAROVSKI意大利
2018/07/23 全球购物
生产部岗位职责范文
2014/02/07 职场文书
团日活动总结书
2014/05/08 职场文书
日语专业求职信
2014/07/04 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
2015年置业顾问工作总结
2015/04/07 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
MySQL之DML语言
2021/04/05 MySQL
Python Django 后台管理之后台模型属性详解
2021/04/25 Python
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android