談JavaScript圖片預加載技術

fmms 12年前發布 | 30K 次閱讀 JavaScript開發 JavaScript

比onload更快獲取圖片尺寸

文章更新:2011-05-31
lightbox類效果為了讓圖片居中顯示而使用預加載,需要等待完全加載完畢才能顯示,體驗不佳(如filick相冊的全屏效果)。javascript無法獲取img文件頭數據,真的是這樣嗎?本文通過一個巧妙的方法讓javascript獲取它。

這是大部分人使用預加載獲取圖片大小的例子:

var imgLoad = function (url, callback) {
    var img = new Image();

img.src = url;
if (img.complete) {
    callback(img.width, img.height);
} else {
    img.onload = function () {
        callback(img.width, img.height);
        img.onload = null;
    };
};

};</pre>

可以看到上面必須等待圖片加載完畢才能獲取尺寸,其速度不敢恭維,我們需要改進。

web應用程序區別于桌面應用程序,響應速度才是最好的用戶體驗。如果想要速度與優雅兼得,那就必須提前獲得圖片尺寸,如何在圖片沒有加載完畢就能獲取圖片尺寸?

十多年的上網經驗告訴我:瀏覽器在加載圖片的時候你會看到圖片會先占用一塊地然后才慢慢加載完畢,并且不需要預設width與height屬性,因為瀏覽器能夠獲取圖片的頭部數據。基于此,只需要使用javascript定時偵測圖片的尺寸狀態便可得知圖片尺寸就緒的狀態。

當然實際中會有一些兼容陷阱,如width與height檢測各個瀏覽器的不一致,還有webkit new Image()建立的圖片會受以處在加載進程中同url圖片影響,經過反復測試后的最佳處理方式:

// 更新:
// 05.27: 1、保證回調執行順序:error > ready > load;2、回調函數this指向img本身
// 04-02: 1、增加圖片完全加載后的回調 2、提高性能

/**

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!