前端开发制作中有需要需要等到页面中的图片加载完毕后才执行某些事件,而使用jquery的load事件只是dom执行完毕,图片未必加载完成,如果要判断图片加载完毕,需要在图片标签上判断。
使用JavaScript判断图片加载完毕,如果图片在页面中的某个img标签中的话,可以用下面这个

$('img').on('load', function() {
    alert('new image loaded: ' + this.src);
});

原生js

imgNode.onload = () => {
    alert('new image loaded: ' + this.src);
};

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

// HTML
<img id='pic' src="../03.png">  

//js
 $(document).ready(function(){

    //jquery
    $('#pic').load(function(){
       // 加载完成 
    });

   //原生  onload
    var pic = document.getElementById('pic')
    pic.onload = pic.onreadystatechange = function(){
       if(!this.readyState||this.readyState=='loaded'||this.readyState=='complete'){
           // 加载完成 
       }
    };

})

注:
1、IE8及以下版本不支持onload事件,但支持onreadystatechange事件;
2、readyState是onreadystatechange事件的一个状态,值为loaded或complete的时候,表示已经加载完毕。
3、如果引入jquery库可以考虑直接使用jquery的load事件来解决兼容问题。
(2)、单张图片(图片动态生成)

//js
var pic = new Image()
pic.src = '../03.png'
pic.onload = pic.onreadystatechange = function(){
    if(!this.readyState||this.readyState=='loaded'||this.readyState=='complete'){
    // 加载完成 
    }
};

//jquery
$('<img/>').attr('src', '../03.png').on('load', function() {
   $(this).remove(); // 防止内存泄露
   //图片加载完毕
});

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

//js
 new Promise((resolve, reject)=>{
    let pic = new Image()
    pic.src = '../03.png'
    pic.onload = function(){
       // 加载完成 
       resolve(pic)
    }
 }).then((pic)=>{
 //code
 })

(4)、多张图片

var img = [],  
    flag = 0, 
    mulitImg = [
    '../01.png',
    '../02.png',
    '../03.png'
 ];
 var imgTotal = mulitImg.length;
 for(var i = 0 ; i < imgTotal ; i++){
    img[i] = new Image()
    img[i].src = mulitImg[i]
    var pic = img[i];
    //用jquery
    $(pic).on('load',function(){
        $(this).remove();
        flag++
        if(flag==imgTotal){
            //全部加载完成
        }
    })
    //原生js
    // img[i].onload = img[i].onreadystatechange = function(){
    //    if(!this.readyState||this.readyState=='loaded'||this.readyState=='complete'){
    //        //第i张图片加载完成
    //        flag++
    //        if( flag == imgTotal ){
    //           //全部加载完成
    //        }
    //    }
    // };
 }

(5)、多张图片(结合ES6 Promise.all())

let mulitImg = [
    '../01.png',
    '../02.png',
    '../03.png'
 ];
 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)=>{
     //全部加载完成
 })

如何判断背景图片加载完毕?

$('<img/>').attr('src', '../01.png').on('load', function() {
   $(this).remove(); // prevent memory leaks as @benweet suggested
   $('body').css('background-image', 'url(../01.png)');
});
最后修改:2023 年 11 月 24 日
如果觉得我的文章对你有用,请随意赞赏