首页 > javascript > 正文

JS判断单、多张图片加载完成-大前端
2017-08-29 10:11:50   来源:   评论:0 点击:

<script type="text javascript">var cpro_id="u2273667";(window["cproStyleApi"] = window["cproStyleApi"] || {})[cpro_id]={at:"
<script type="text/javascript">var cpro_id="u2273667";(window["cproStyleApi"] = window["cproStyleApi"] || {})[cpro_id]={at:"3",rsi0:"778",rsi1:"125",pat:"6",tn:"baiduCustNativeAD",rss1:"#FFFFFF",conBW:"0",adp:"1",ptt:"0",titFF:"%E5%BE%AE%E8%BD%AF%E9%9B%85%E9%BB%91",titFS:"14",rss2:"#555555",titSU:"0",ptbg:"90",piw:"0",pih:"0",ptp:"0"}</script><script src="http://cpro.baidustatic.com/cpro/ui/c.js" type="text/javascript"></script>

在实际的运用中有这样一种场景,某资源加载完成后再执行某个操作,例如在做导出时,后端通过打开模板页生成PDF,并返回下载地址。这时前后端通常需要约定一个flag,用以标识模板准备就绪,可以生成PDF了。

试想,如果模板中有图片,此时如何判断图片是否加载完成?

在此之前来了解一下jquery的ready与window.onload的区别,ready只是dom结构加载完毕,便视为加载完成。(此时图片没有加载完毕),onload是指dom的生成和资源完全加载(比如flash、图片)出来后才执行。接下来回到正题,先从单张图片说起。

(1)、单张图片(图片在文档中)

// HTML<img id='xiu' src="http://1xjs.com/phpcms/uploadfile/2017/0829/20170829101151645.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://1xjs.com/phpcms/uploadfile/2017/0829/20170829101151645.jpg' xiu.onload = function(){    // 加载完成  }

(3)、单张图片(结合ES6 Promise)

//js new Promise((resolve, reject)=>{    let xiu = new Image()    xiu.src = 'http://1xjs.com/phpcms/uploadfile/2017/0829/20170829101151645.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)=>{     //全部加载完成 })

相关热词搜索:

上一篇:图表库ECharts的使用-大前端
下一篇:最后一页

分享到: 收藏
评论排行