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 相关文章推荐
谷歌浏览器 insertCell与appendChild的区别
Feb 12 Javascript
xheditor与validate插件冲突的解决方案
Apr 15 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
Sep 29 Javascript
jquery1.10给新增元素绑定事件的方法
Mar 06 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
Aug 22 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
Sep 04 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
Mar 05 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
Aug 22 Javascript
对Vue table 动态表格td可编辑的方法详解
Aug 28 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
Oct 20 Javascript
Vue项目实现简单的权限控制管理功能
Jul 17 Javascript
Flexible.js可伸缩布局实现方法详解
Nov 13 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
PHP 变量定义和变量替换的方法
2009/07/30 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
php解析url并得到url中的参数及获取url参数的四种方式
2015/10/26 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
改版了网上的一个js操作userdata
2007/04/27 Javascript
javascript 写类方式之六
2009/07/05 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
jQuery中事件与动画的总结分享
2016/05/24 Javascript
Javascript点击按钮随机改变数字与其颜色
2016/09/01 Javascript
nodejs提示:cross-device link not permitted, rename错误的解决方法
2019/06/10 NodeJs
微信小程序 网络通信实现详解
2019/07/23 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
从Python的源码来解析Python下的freeblock
2015/05/11 Python
Python3搜索及替换文件中文本的方法
2015/05/22 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
python 杀死自身进程的实现方法
2019/07/01 Python
python Kmeans算法原理深入解析
2019/08/23 Python
python实现图片插入文字
2019/11/26 Python
用python进行视频剪辑
2020/11/02 Python
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
在html页面中取得session中的值的方法
2020/08/11 HTML / CSS
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
泰国的头号网上婴儿用品店:Motherhood.co.th
2019/04/09 全球购物
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
写给女生的道歉信
2014/01/14 职场文书
施工材料员岗位职责
2014/02/12 职场文书
计算机网络工程专业职业生涯规划书
2014/03/10 职场文书
《白鹅》教学反思
2014/04/13 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
重阳节活动主持词
2015/07/04 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS
python 批量压缩图片的脚本
2021/06/02 Python
如何自己动手写SQL执行引擎
2021/06/02 MySQL