天天看點

JS魔法堂:IMG元素加載行為詳解

一、前言                            

二、資源加載的相關屬性和事件                  

  資源加載首先當然是确定資源位置的 src屬性 、随之就是資源加載成功與否的 onload事件 和 onerror事件 ,對于IE5~10來說還多了一個 onreadystatechage事件 和與該事件相關聯的 readyState屬性 和 complete屬性 。

   onload事件 ,當資源加載完成并成功解析後觸發(若加載的不是image/*類型的資源,則解析失敗)。

   onerror事件 ,當找不到資源或解析失敗後觸發。

   onreadystatechange事件 ,在onload事件後觸發。

   readyState屬性 ,用于表示IMG元素目前的資源裝載狀态,預設值為"uninitialized",onload事件觸發後變為"complete"(onload事件處理函數運作時,readyState依然為"uninitialized")。

   complete屬性 ,用于表示IMG元素的資源是否成功解析。預設為false,,onload事件觸發後變為true(onload事件處理函數運作時,readyState依然為false)。

三、實驗開始                          

  本次實驗将建立 img元素 并對其的 src屬性 分别賦予以下内容 fsjohnhuang.png 、 :0 、 空字元串 、 空白字元串 、 //:0 、 javascript:void 0 和 data:image/png,foo ,并訂閱img元素的onload和onerror事件,IE5~10下還訂閱了onreadystatechange事件,統計整理其在IE5~11、Chrome和FF下的行為特點和事件響應延時。具體實驗統計如下:

  測試環境:

  1.測試頁面位址為http://localhost:9000/test.html

    2. 圖檔fsjohnhuang.png的大小為12KB

  符号說明:

     N/A 表示該列事件不觸發。

src屬性值

備注

Chrome

FireFox

IE5~11

onload事件

onerror事件

IE5~10

on

ready

state

change

fsjohnhuang.png

有效URI,

URI自動補全為

http://localhost

:9000/fsjohnhu

ang.png

首次請求延時為2~5ms

N/A

1.發起資源請求;

2.由于對資源進行緩存,後續對同一資源的請求,延時為0~1ms

首次請求延時為4~10ms

首次請求延時為3~9ms

發生在onload事件之後

:0

無效URI,

URI自動補全為http://localhost

:9000/:0

若IMG元素

在渲染樹中,

則會顯示加載

失敗的示意圖。

延時為5~300+ms

 1.發起資源請求

延時為16~60ms

首次請求延時為16ms左右

空字元串,""

無效URI

延時為0~1ms

1.不發起資源請求;

2. 若IMG元素在渲染樹中,不顯示加載失敗的示意圖。

N/A 

2. 若IMG元素在渲染樹中,顯示加載失敗的示意圖。

 延時為0~1ms

空白字元串,"    "

延時為0~1ms 

延時為16~60ms 

首次延時為14ms左右 

 N/A

2. 若IMG元素在渲染樹中,顯示加載失敗的示意圖;

3. 由于對資源進行緩存,後續對同一資源的請求,延時為0~1ms

//:0

無效URI,會自動補全為http://:0/

 延時為0~1ms 

  延時為0~1ms

1.發起資源請求,但會被浏覽器取消掉(No Server Hits);

javascript:void 0

無效的JavaScript URI Scheme

 延時為1~2ms

 1.通過JS執行img.src=

"javascript:void 0"會報"拒絕通路"的異常。假如通過$.html()或靜态html方式設定src為javascript:void 0,則不會報該異常。

data:image/png,f

無效的Data URI Scheme

延時0~1ms 

1.不會發起資源請求;

延時為1~2ms 

 延時0~1ms

  由上述統計資料可知,在Chrome、FF和IE中行為比較同一的是加載無效DataURI Scheme。延時也比較短且穩定。是以jsDeffered采用此方式來為異步執行提速!

四、總結                            

  這裡僅僅對IMG元素加載http、javascript和data的URI Scheme等進行實驗,加上實驗手段等問題,難免導緻統計資料不全面,若有纰漏希望大家指正,謝謝。

五、參考                            

  http://www.w3help.org/zh-cn/causes/BX9021

  http://stackoverflow.com/questions/5775469/whats-the-valid-way-to-include-an-image-with-no-src

如果您覺得本文的内容有趣就掃一下吧!捐贈互勉!

JS魔法堂:IMG元素加載行為詳解
JS魔法堂:IMG元素加載行為詳解
JS魔法堂:IMG元素加載行為詳解

<a href="http://home.cnblogs.com/u/fsjohnhuang/">^_^肥仔John</a>

<a href="http://home.cnblogs.com/u/fsjohnhuang/followees">關注 - 85</a>

<a href="http://home.cnblogs.com/u/fsjohnhuang/followers">粉絲 - 707</a>

<a>+加關注</a>

2

<a></a>

<a href="http://www.ucancode.com/index.htm" target="_blank">【推薦】超50萬VC++源碼: 大型工控、組态\仿真、模組化CAD源碼2018!</a>

<a href="https://cloud.tencent.com/developer/support-plan?fromSource=gwzcw.710852.710852.710852" target="_blank">【推薦】加入騰訊雲自媒體扶持計劃,免費領取域名&amp;伺服器</a>

JS魔法堂:IMG元素加載行為詳解

<b>最新IT新聞</b>:

JS魔法堂:IMG元素加載行為詳解

<b>最新知識庫文章</b>:

<a href="mailto:John@github" target="_blank">肥仔John@github</a>

繼續閱讀