在实际的运用中有这样一种场景,某资源加载完成后再执行某个操作,例如在做导出时,后端通过打开模板页生成PDF,并返回下载地址。这时前后端通常需要约定一个flag,用以标识模板准备就绪,可以生成PDF了。
试想,如果模板中有图片,此时如何判断图片是否加载完成?
在此之前来了解一下jquery的ready与window.onload的区别,ready只是dom结构加载完毕,便视为加载完成。(此时图片没有加载完毕),onload是指dom的生成和资源完全加载(比如flash、图片)出来后才执行。接下来回到正题,先从单张图片说起。
(1)、单张图片(图片在文档中)
// HTML <img id='xiu' src="http://www.daqianduan.com/wp-content/uploads/2014/11/hs-xiu.jpg"> //js $(document).ready(function(){ //jquery $('#xiu').load(function(){ // 加载完成 }); //原生 onload var xiu = document.getElementById('xiu') xiu.onload = xiu.onreadystatechange = function(){ if(!this.readyState||this.readyState=='loaded'||this.readyState=='complete'){ // 加载完成 } }; })
注:
1、IE8及以下版本不支持onload事件,但支持onreadystatechange事件;
2、readyState是onreadystatechange事件的一个状态,值为loaded或complete的时候,表示已经加载完毕。
3、以下内容省略兼容
(2)、单张图片(图片动态生成)
//js var xiu = new Image() xiu.src = 'http://www.daqianduan.com/wp-content/uploads/2014/11/hs-xiu.jpg' xiu.onload = function(){ // 加载完成 }
(3)、单张图片(结合ES6 Promise)
//js new Promise((resolve, reject)=>{ let xiu = new Image() xiu.src = 'http://www.daqianduan.com/wp-content/uploads/2014/11/hs-xiu.jpg' xiu.onload = function(){ // 加载完成 resolve(xiu) } }).then((xiu)=>{ //code })
(4)、多张图片
var img = [], flag = 0, mulitImg = [ 'http://www.daqianduan.com/wp-content/uploads/2017/03/IMG_0119.jpg', 'http://www.daqianduan.com/wp-content/uploads/2017/01/1.jpg', 'http://www.daqianduan.com/wp-content/uploads/2015/11/jquery.jpg', 'http://www.daqianduan.com/wp-content/uploads/2015/10/maid.jpg' ]; var imgTotal = mulitImg.length; for(var i = 0 ; i < imgTotal ; i++){ img[i] = new Image() img[i].src = mulitImg[i] img[i].onload = function(){ //第i张图片加载完成 flag++ if( flag == imgTotal ){ //全部加载完成 } } }
(5)、多张图片(结合ES6 Promise.all())
let mulitImg = [ 'http://www.daqianduan.com/wp-content/uploads/2017/03/IMG_0119.jpg', 'http://www.daqianduan.com/wp-content/uploads/2017/01/1.jpg', 'http://www.daqianduan.com/wp-content/uploads/2015/11/jquery.jpg', 'http://www.daqianduan.com/wp-content/uploads/2015/10/maid.jpg' ]; let promiseAll = [], img = [], imgTotal = mulitImg.length; for(let i = 0 ; i < imgTotal ; i++){ promiseAll[i] = new Promise((resolve, reject)=>{ img[i] = new Image() img[i].src = mulitImg[i] img[i].onload = function(){ //第i张加载完成 resolve(img[i]) } }) } Promise.all(promiseAll).then((img)=>{ //全部加载完成 })
如果图片加载失败404,是执行img.onerror(),而不执行img.onload(),那么flag == imgTotal 就不会相等了
nb
0.svafv
onload事件绑定应该再src赋值前
一起学习前端交流的html5技术交流群 250777811 群文件上传了很多的项目实战,大家可以练练手
不错
留言看看
隨便留言嗎?
多张页面结合网站统计
艳照门图片,日本片直接访问 lanvbo.com/xinggan/index.html
daanjia.com lanvbo.com
11111
daanjia.com lanvbo.com
答案家 daanjia.com 美女图片 lanvbo.com
lanvbo.com
www .lanvbo.com
www
aaaaaaaaaa222
aaaaaaaaaa
不错
辣女啵
11111
测试头像
发的杀
haha
深圳前端技术高级群622293272
头像好慢啊
测试评论
不错。我的新主题,刚好用得上~
aa
呵呵
12345678
这么牛逼的文章,【请原谅菜鸟这样说】,我居然是第3720人读的,以后要争取第一个人,读这些牛叉的文章【本宝宝暂时用不到】,我相信,以后会有机会用到的
文章很赞,邀请来深圳前端高级群,只接收有经验和前端技术爱好者,纯粹研究技术,群号622293272
第4个 loaded 会报错呢,未定义
1
哈哈