javaScript & jquery完美判断图片是否加载完毕
好久没写东西了,正好最近因为工作需要,写了一个瀑布流异步加载的程序。
今天就不谈瀑布流,来谈一下关于load的问题。
-------------------------------------------------------------
众所周知,常见瀑布流当鼠标滚动到浏览器底部的时候,就会发起一个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完美判断图片是否加载完毕的更多相关文章
- jQuery load() 判断 iframe 是否加载完毕
判断 iframe 是否加载完毕 方法.jQuery load() var frm = document.getElementById('myiframe'); $(frm).load(functi ...
- jquery判断图片是否加载完毕
来源: <http://www.2cto.com/kf/201409/331234.html> 利用图片没有加载完成的时候,宽高为0.我们很容易判断图片的一个加载情况.如下: 思路:判断图 ...
- js判断图片是否加载完毕
附件: https://www.jb51.net/article/102385.htm 问题: .offset().top和$(window).scrollTop()每次刷新页面后滚动的值有时候会不 ...
- JavaScript实现判断图片是否加载完成的3种方法整理
JavaScript实现判断图片是否加载完成的3种方法整理 有时候我们在前端开发工作中为了获取图片的信息,需要在图片加载完成后才可以正确的获取到图片的大小尺寸,并且执行相应的回调函数使图片产生某种显示 ...
- JavaScript判断图片是否加载完成的三种方式
JavaScript判断图片是否加载完成的三种方式 有时需要获取图片的尺寸,这需要在图片加载完成以后才可以.有三种方式实现,下面一一介绍. 一.load事件 1 2 3 4 5 6 7 8 9 10 ...
- 使用JavaScript判断图片是否加载完成的三种实现方式
有时需要获取图片的尺寸,这需要在图片加载完成以后才可以.有三种方式实现,下面一一介绍. 一.load事件 <!DOCTYPE HTML> <html> <head> ...
- JavaScript判断图片是否加载完成
一.load事件 <!DOCTYPE HTML><html> <head> <meta charset="utf-8"> ...
- JavaScript判断图片是否加载完成的三种方式 (转)
一.load事件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <!DOCTYPE HTML> <html> <head> ...
- JS判断图片是否加载完成三种方式
1.img的complete属性 轮询不断监测img的complete属性,如果为true则表明图片已经加载完毕,停止轮询.该属性所有浏览器都支持. <p id="p1"&g ...
随机推荐
- springboot 详细配置2
# =================================================================== # COMMON SPRING BOOT PROPERTIE ...
- macos ssh host配置及免密登陆
windows下面有xshell 这样的可视化ssh管理工具 macos 下面使用终端做下简单配置,也非常方便,具体过程如下 生成秘钥 cd ~/.sshssh-keygen -t rsa 生成了私钥 ...
- DelphiTXT文档编辑器
EXE:http://files.cnblogs.com/xe2011/Text_EditorRelease2013-12-20-185320.rar Delphi XE5 PAS:http://fi ...
- [ES6] 23. Rest Parameters & Spread Parameters
Rest Parameters: In ES5, when you don't know how many paramters will be passed in, you can use argum ...
- Antelope与 Barracude MYSQL 文件格式
作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#163.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究. Antelope是 ...
- C# dynamic关键字的使用方法
dynamic和var的区别:1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型.2.var只能用于声明方法内部的局部变量,而dynamic可用于局部变量,字段, ...
- 命令行修改weblogic用户名和密码
语法为:java weblogic.security.utils.AdminAccount <NewAdminUserName> <NewAdminPassword> dir ...
- Iperf使用方法
Iperf使用方法 Iperf 是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量.Iperf可以测量最大TCP带宽,具有多种参数和UDP特性.Iperf可以报告带宽,延迟抖动和数据包 ...
- 集合(Collection,set,list,map)
package cn.hncu.col.col; import java.util.ArrayList;import java.util.Collection;import java.util.Has ...
- Python 学习开发笔记之IO操作
文件或者目录的路径操作 获取当前工作目录 import os import sys cwd = os.getcwd() 路径的拼接 os.path.join(path,"dir") ...