亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

使用Image預加載填坑

標簽:
JavaScript

问题:
img.src属性赋值后,获取图片宽高有误

示例:

function loadImage () {    let img = new Image()  // 将会创建一个新的HTMLImageElement实例,它的功能等价于document.createElement(‘img’)

    img.src = 'https://upload.jianshu.io/users/upload_avatars/6522842/f45df573-27b5-4853-b4d9-308e402ed9ff.jpeg?imageMogr2/auto-orient/strip'

    let { naturalWidth } = img // 获取图片的原始大小

    console.log(naturalWidth)
}

loadImage() // 0loadImage() // 300

问题描述:
首次执行函数 loadImage()的时候输出0,等过一小会儿再执行这个函数的时候输出图片的原始大小了

原因:

  • 当给 img.src 赋值是,其实是发送了一次对图片的http 请求(发送请求是一个异步过程),那么当请求还没有完成时,我们同步执行 console.log 操作就无法获取到图片原始尺寸,而输出了默认值 0。

  • 当图片请求完成时,就取到了图片的width;当我们没有单独在css 或 dom 节点中设置 img 的width 、height 值时,width 就会把 naturalWidth(原始尺寸)作为默认值

优化:
其实Image Web Api提供了很多钩子,像、

function loadImage () {    let img = new Image()  // 将会创建一个新的HTMLImageElement实例,它的功能等价于 document.createElement(‘img’)

    img.src = 'https://upload.jianshu.io/users/upload_avatars/6522842/f45df573-27b5-4853-b4d9-308e402ed9ff.jpeg?imageMogr2/auto-orient/strip'
  
  if (img.complete) { // 当加载已被浏览器缓存的图片时,并不会触发img.事件,所以在这里要判断一下图片是不是已加载完成

       let { naturalWidth } = img // 获取图片的原始大小 

       console.log(naturalWidth) 

 } else {
      img. = function () { // 当图片加载完毕,添加处理方法

            let { naturalWidth } = img // 获取图片的原始大小 

            console.log(naturalWidth) 

      }

      img. = function () {

          alert('error') 

      } 
  }
}

loadImage() // 300



作者:程序媛sherry
链接:https://www.jianshu.com/p/4878f1be8e64


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
JAVA開發工程師
手記
粉絲
205
獲贊與收藏
1011

關注作者,訂閱最新文章

閱讀免費教程

  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消