轉:http://www.daqianduan.com/6419.htmlhtml
試想,若是模板中有圖片,此時如何判斷圖片是否加載完成?jquery
在此以前來了解一下jquery的ready與window.onload的區別,ready只是dom結構加載完畢,便視爲加載完成。(此時圖片沒有加載完畢),onload是指dom的生成和資源徹底加載(好比flash、圖片)出來後才執行。接下來回到正題,先從單張圖片提及。promise
(1)、單張圖片(圖片在文檔中)dom
// 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'){ // 加載完成 } }; })
注:
一、IE8及如下版本不支持onload事件,但支持onreadystatechange事件;
二、readyState是onreadystatechange事件的一個狀態,值爲loaded或complete的時候,表示已經加載完畢。
三、如下內容省略兼容this
(2)、單張圖片(圖片動態生成)spa
//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)code
//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)、多張圖片htm
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)=>{ //所有加載完成 })