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 相关文章推荐
总结AJAX相关JS代码片段和浏览器模型
Aug 15 Javascript
Javascript document.referrer判断访客来源网址
May 15 Javascript
myEvent.js javascript跨浏览器事件框架
Oct 24 Javascript
javascript中Array数组的迭代方法实例分析
Feb 04 Javascript
jquery validate表单验证插件
Sep 06 Javascript
jquery实现的table排序功能示例
Mar 10 Javascript
详解Angular-cli生成组件修改css成less或sass的实例
Jul 27 Javascript
十分钟带你快速了解React16新特性
Nov 10 Javascript
webpack打包js的方法
Mar 12 Javascript
webpack-url-loader 解决项目中图片打包路径问题
Feb 15 Javascript
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
使用JS前端技术实现静态图片局部流动效果
Aug 05 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
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
PHP 采集程序中常用的函数
2009/12/09 PHP
PHP采集相关教程之一 CURL函数库
2010/02/15 PHP
php Calender(日历)代码分享
2014/01/03 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
php查询whois信息的方法
2015/06/08 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
jQuery 添加/移除CSS类实现代码
2010/02/11 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
jquery数组之存放checkbox全选值示例代码
2013/12/20 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
JavaScript学习笔记之数组去重
2016/03/23 Javascript
jQuery仿写百度百科的目录树
2017/01/03 Javascript
js 颜色选择插件
2017/01/23 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
分享vue.js devtools遇到一系列问题
2017/10/24 Javascript
weebox弹出窗口不居中显示的解决方法
2017/11/27 Javascript
详解Vue之计算属性
2020/06/20 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
jQuery实现日历效果
2020/09/11 jQuery
js实现移动端图片滑块验证功能
2020/09/29 Javascript
[00:52]DOTA2第二届亚洲邀请赛预选赛宣传片
2017/01/13 DOTA
python自动截取需要区域,进行图像识别的方法
2018/05/17 Python
Python Image模块基本图像处理操作小结
2019/04/13 Python
PyQt5 QTable插入图片并动态更新的实例
2019/06/18 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
革命先烈的英雄事迹材料
2014/02/15 职场文书
课堂教学改革实施方案
2014/03/17 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书
大学军训通讯稿
2015/07/18 职场文书
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL