黑马程序员技术交流社区

标题: 【广州前端】JS判断单、多张图片加载完成 [打印本页]

作者: 老哥哥    时间: 2018-1-11 14:45
标题: 【广州前端】JS判断单、多张图片加载完成
在实际的运用中有这样一种场景,某资源加载完成后再执行某个操作,例如在做导出时,后端通过打开模板页生成PDF,并返回下载地址。这时前后端通常需要约定一个flag,用以标识模板准备就绪,可以生成PDF了。
试想,如果模板中有图片,此时如何判断图片是否加载完成?
在此之前来了解一下jquery的ready与window.onload的区别,ready只是dom结构加载完毕,便视为加载完成。(此时图片没有加载完毕),onload是指dom的生成和资源完全加载(比如flash、图片)出来后才执行。接下来回到正题,先从单张图片说起。
(1)、单张图片(图片在文档中)
[AppleScript] 纯文本查看 复制代码
// 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)、单张图片(图片动态生成)
[AppleScript] 纯文本查看 复制代码
//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)
[AppleScript] 纯文本查看 复制代码
//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)、多张图片
[AppleScript] 纯文本查看 复制代码
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 = new Image()
    img.src = mulitImg
    img.onload = function(){
       //第i张图片加载完成
       flag++
       if( flag == imgTotal ){
          //全部加载完成
       }
    }
}
(5)、多张图片(结合ES6 Promise.all())
[AppleScript] 纯文本查看 复制代码
  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 = new Promise((resolve, reject)=>{
         img = new Image()
         img.src = mulitImg
         img.onload = function(){
              //第i张加载完成
              resolve(img)
         }
     })
}
Promise.all(promiseAll).then((img)=>{
     //全部加载完成
})



点击查看更多精彩前端资源
点击有惊喜






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2