jquery判断图片或者背景图片加载完毕

前端开发制作中有需要需要等到页面中的图片加载完毕后才执行某些事件,而使用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="https://qdkfweb.cn/a/a3.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 = 'https://qdkfweb.cn/a/a3.png'
pic.onload = pic.onreadystatechange = function(){
	if(!this.readyState||this.readyState=='loaded'||this.readyState=='complete'){
	// 加载完成 
	}
};

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

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

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

(4)、多张图片

var img = [],  
    flag = 0, 
    mulitImg = [
    'https://qdkfweb.cn/a/a1.png',
    'https://qdkfweb.cn/a/a2.png',
    'https://qdkfweb.cn/a/a3.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 = [
    'https://qdkfweb.cn/a/a1.png',
    'https://qdkfweb.cn/a/a2.png',
    'https://qdkfweb.cn/a/a3.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', 'https://qdkfweb.cn/a/a3.png').on('load', function() {
   $(this).remove(); // prevent memory leaks as @benweet suggested
   $('body').css('background-image', 'url(https://qdkfweb.cn/a/a3.png)');
});

 


关注我

我的微信公众号:前端开发博客,在后台回复以下关键字可以获取资源。

  • 回复「小抄」,领取Vue、JavaScript 和 WebComponent 小抄 PDF
  • 回复「Vue脑图」获取 Vue 相关脑图
  • 回复「思维图」获取 JavaScript 相关思维图
  • 回复「简历」获取简历制作建议
  • 回复「简历模板」获取精选的简历模板
  • 回复「加群」进入500人前端精英群
  • 回复「电子书」下载我整理的大量前端资源,含面试、Vue实战项目、CSS和JavaScript电子书等。
  • 回复「知识点」下载高清JavaScript知识点图谱

每日分享有用的前端开发知识,加我微信:caibaojian89 交流