<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          圖片加載失敗的前端解決方案

          共 1865字,需瀏覽 4分鐘

           ·

          2022-01-06 22:13

          42a5669dc8919eea14eea60b33acde9f.webp

          來源 |?www.fly63.com

          在實際項目中,不可避免的會遇到在頁面中加載大量圖片,但可能由于網(wǎng)絡問題,或者圖片文件缺失等問題,導致圖片不能正常展示,并且在不同瀏覽器處理錯誤圖片是不一樣的,有的干脆就顯示差號,例如IE,有的顯示一張破碎的圖片,有的則是給一張高度比較大的默認圖,例如PC端的火狐,IOS中Safari,還有安卓中的UC瀏覽器。這樣在手機中就會導致左右兩側圖片高度不一致!我們希望有一種降級處理的方式,可以在圖片加載失敗后顯示一張我們預先設定好的默認圖片。

          解決方案

          由于圖片加載失敗后,會拋出一個 error 事件,所以我們只需要判斷當圖片加載失敗的時候給一個默認圖就可以了,不讓瀏覽器使用其自帶的默認圖。比如:
          <img src="http://fly63.com/img.png" onerror="this.src = '//fly63.com/default.png'">

          但是這樣呢也會存在一些問題,比如:

          1.我們需要手動的向 img 標簽中添加內(nèi)聯(lián)事件,在實際開發(fā)過程中,很難保證每張圖片都不漏寫。
          2.因為圖片加載失敗進入默認圖,那么默認圖再加載失敗怎么辦呢?

          優(yōu)化方案一:

          我們可以通過在全局監(jiān)聽的方式,來對異常圖片做降級處理,這樣不用在每個img標簽中不用onerror事件。

          監(jiān)聽圖片自身的 error 事件,實際上在事件流中是處于目標階段。對于 img 的 error 事件來說,是無法冒泡的,但是是可以捕獲的,我們的實現(xiàn)如下:

          window.addEventListener('error',function(e){    //當前異常是由圖片加載異常引起的    if( e.target.tagName.toUpperCase() === 'IMG' ){        e.target.src = '//fly63.com/default.jpg';    }},true)

          最后,我們在思考一個問題,當網(wǎng)絡出現(xiàn)異常的時候,必然會出現(xiàn)什么網(wǎng)絡圖片都無法加載的情況,這樣就會導致我們監(jiān)聽的 error 事件。

          被無限觸發(fā),所以我們可以設定一個計數(shù)器,當達到期望的錯誤次數(shù)時停止對圖片賦予默認圖片的操作,改為提供一個Base64的圖片。

          實現(xiàn)起來也很簡單,如下:

          window.addEventListener('error',function(e){    let target = e.target, // 當前dom節(jié)點        tagName = target.tagName,        count = Number(target.dataset.count ) || 0, // 以失敗的次數(shù),默認為0        max= 3; // 總失敗次數(shù),此時設定為3    // 當前異常是由圖片加載異常引起的    if( tagName.toUpperCase() === 'IMG' ){        if(count >= max){            target.src = 'data:image/jpeg;base64*******';//base64圖片字符串        }else{            target.dataset.count = count + 1;            target.src = '//xxx/default.jpg';        }    }},true)

          優(yōu)化方案二:

          如果我們不需要全局監(jiān)聽error事件,仍然想用onerror事件,如何保證不進入死循環(huán)呢?代碼如下:

          <img src="http://fly63.com/img.png" onerror="nofind()"/><script type="text/JavaScript">      function nofind(){          var img=event.srcElement || event.target ; //獲取img對象,火狐是event.target ,IE及谷歌其他是event.srcElement         img.src="http://fly63.com/default.png";         img.onerror=null;       }</script>


          學習更多技能

          請點擊下方公眾號

          360bd8082ab0612ecef7f46662ff75f9.webp

          c444fc6c5d06f5c4cae2822260562090.webp

          瀏覽 110
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码成人在线 | 日韩精品无码系列视频 | 人成视频在线观看一区二区 | 亚洲国产精品成人综合色在线婷婷 | 欧美精品卡一操逼 |