需求:做輪播插件時,得計算圖片的寬高,並根據容器最大最小寬高來使圖片做適當調整。
現象:圖片超出未調整。


解決:
function loadImage(url, callback) {
var img = new Image(); //創建一個Image對象,實現圖片的預加載
img.onload = function () { //圖片加載載完畢時異步調用callback函數。
callback.call(this,true,img);//將回調函數的this替換為Image對象
};
img.onerror=function(){
callback.call(this,false,img);
}
img.src = url;
};
When the image is cached, the onload callback isn't called with your code as the load event is produced before the callback is set.
當圖片被緩存,在回調函數設置之前,load 事件已經產生,onload函數就沒有被回調。
注:將onload寫在src前面,這樣可以兼容到IE8,這里是異步加載,圖片從緩存中獲取速度快,如果onload寫在src后面有可能加載完onload不能觸發。
相關瀏覽器測試:后台設置了圖片在一分鍾之后緩存失效。response.addHeader("Cache-Control", "max-age=60");

img說明:https://html.spec.whatwg.org/multipage/embedded-content.html#dom-image
IE11: 點擊地址欄旁邊的刷新按鈕,取服務端圖片,自動帶上弱ETag。 (注:location.reload和點擊刷新按鈕效果一樣)

IE11: 地址欄+enter ,瀏覽器取緩存,沒有向服務器發出請求。

IE11備注:onload可以寫在src后面,讀取瀏覽器緩存這個方法會觸發。IE9和IE11上述現象基本一致。
IE8 用location.reload()刷新會請求后台(有弱Etag),在網址中打回車鍵則不會請求后台,直接拿瀏覽器緩存。
IE8直接讀取瀏覽器緩存中的圖片時,如果 先src連后onload回調,則onload不觸發。
火狐55.0.3 (32 位):點擊刷新按鈕,圖片從后台取

火狐:地址欄+enter,直接從瀏覽器緩存中取圖片,且未產生請求,同時html拿的也是緩存未向后台請求(耗時為0)


火狐:location.reload(),向后台請求圖片
FF備注: src可以寫在onload后面,無論是否從瀏覽器中加載圖片還是從服務端加載都可以觸發onload
Chome 版本 60.0.3112.113(正式版本) (64 位)
chrome:點擊刷新按鈕,可能讀取緩存(圖片未超時)也可能請求后台

chrome:地址欄+enter : 未超時 ,直接讀取瀏覽器緩存
chrome:Location.reload ,可能讀取緩存(圖片未超時)也可能請求后台

chrome 備注: src可以寫在onload后面,無論是否從瀏覽器中加載圖片還是從服務端加載都可以觸發onload。獲取瀏覽器緩存時(diskcache和memorycache的不同可參考http://www.jianshu.com/p/74c3e333c104)
注:為了圖片加載時都觸發onload,需要把onload寫在src前面。本項目沒有考慮兼容IE8以下的IE瀏覽器。
以上直接取瀏覽器緩存(狀態碼是200,但是未請求后台)默認是在圖片未過期的時候,過期了還是會向后台請求獲取圖片,其他未特殊說明則強制請求后台獲取圖片。
參考問題解決的說明:https://stackoverflow.com/questions/14429656/onload-callback-on-image-not-called-in-ie8
