成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

再談JavaScript圖片預(yù)加載技術(shù)

開發(fā) 前端
由于JavaScript無法獲取img文件頭數(shù)據(jù),必須等待其加載完畢后才能獲取真實的大小,所以lightbox類效果為了讓圖片居中顯示,導(dǎo)致其速度體驗要比直接輸出的差很多。而本文所提到的預(yù)加載技術(shù)主要是讓JavaScript快速獲取圖片頭部數(shù)據(jù)的尺寸。

51CTO推薦專題:JavaScript學(xué)習(xí)筆記 有問有答

一段典型的使用預(yù)加載獲取圖片大小的例子:

  1. var imgLoad = function (url, callback) {  
  2. var img = new Image();  
  3.  
  4. img.src = url;  
  5. if (img.complete) {  
  6. callback(img.width, img.height);  
  7. else {  
  8. img.onload = function () {  
  9. callback(img.width, img.height);  
  10. img.onload = null;  
  11. };  
  12. };  
  13.  
  14. }; 

可以看到使用onload的方式必須等待圖片加載完畢,其速度不敢恭維。

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

十多年的上網(wǎng)經(jīng)驗告訴我:瀏覽器在加載圖片的時候你會看到圖片會先占用一塊地然后才慢慢加載完畢,并且這里大部分的圖片都是沒有預(yù)設(shè)width與height屬性的,因為瀏覽器能夠獲取圖片的頭部數(shù)據(jù)。基于此,只需要使用javascript定時偵測圖片的尺寸狀態(tài)便可得知圖片尺寸就緒的狀態(tài)。

實現(xiàn)代碼:

  1. var imgReady = function (url, callback, error) {  
  2. var width, height, intervalId, check, div,  
  3. img = new Image(),  
  4. body = document.body;  
  5.  
  6. img.src = url;  
  7.  
  8. // 從緩存中讀取  
  9. if (img.complete) {  
  10. return callback(img.width, img.height);  
  11. };  
  12.  
  13. // 通過占位提前獲取圖片頭部數(shù)據(jù)  
  14. if (body) {  
  15. div = document.createElement('div');  
  16. div.style.cssText = 'visibility:hidden;position:absolute;left:0;top:0;width:1px;height:1px;overflow:hidden';  
  17. div.appendChild(img)  
  18. body.appendChild(div);  
  19. width = img.offsetWidth;  
  20. height = img.offsetHeight;  
  21.  
  22. check = function () {  
  23. if (img.offsetWidth !== width || img.offsetHeight !== height) {  
  24. clearInterval(intervalId);  
  25. callback(img.offsetWidth, img.clientHeight);  
  26. img.onload = null;  
  27. div.innerHTML = '';  
  28. div.parentNode.removeChild(div);  
  29. };  
  30. };  
  31.  
  32. intervalId = setInterval(check, 150);  
  33. };  
  34.  
  35. // 加載完畢后方式獲取  
  36. img.onload = function () {  
  37. callback(img.width, img.height);  
  38. img.onload = img.onerror = null;  
  39. clearInterval(intervalId);  
  40. body && img.parentNode.removeChild(img);  
  41. };  
  42.  
  43. // 圖片加載錯誤  
  44. img.onerror = function () {  
  45. error && error();  
  46. clearInterval(intervalId);  
  47. body && img.parentNode.removeChild(img);  
  48. };  
  49.  
  50. }; 

是不是很簡單?這樣的方式獲取攝影級別照片尺寸的速度往往是onload方式的幾十多倍,而對于web普通(800×600內(nèi))瀏覽級別的圖片能達到秒殺效果。

好了,請觀賞令人愉悅的 DEMO ,通過測試的瀏覽器:Chrome、Firefox、Safari、Opera、IE6、IE7、IE8。
 

原文鏈接:http://www.planeart.cn/?p=1121

【編輯推薦】

  1. 示例:JavaScript中的后續(xù)傳遞風(fēng)格
  2. JavaScript中同名標(biāo)識符優(yōu)先級詳解
  3. 淺析JavaScript繼承方式
  4. 如何編寫高質(zhì)量的JavaScript代碼
  5. 通過JavaScript或PHP檢測Android設(shè)備
責(zé)任編輯:陳貽新 來源: 唐斌的博客
相關(guān)推薦

2022-01-04 16:50:47

JavaScript圖片網(wǎng)站

2021-08-04 09:51:02

代理設(shè)計模式

2012-02-27 09:30:22

JavaScript

2011-07-22 13:30:52

JavaScript

2009-11-04 11:51:08

技術(shù)領(lǐng)袖

2011-01-17 19:35:04

javascriptjqueryweb

2020-10-31 16:43:58

6G5GAI

2012-06-05 10:22:45

jQuery

2011-07-29 10:12:12

JavaScript

2014-11-05 10:31:28

2009-03-15 10:09:56

IE8瀏覽器進程模型

2010-03-29 14:09:34

2024-06-17 08:26:23

性能ViewPager頁面

2015-03-10 13:55:31

JavaScript預(yù)解析原理及實現(xiàn)

2023-04-18 23:44:54

性能優(yōu)化開發(fā)preload

2023-06-06 15:31:13

JavaScript開發(fā)

2024-10-22 08:00:00

2013-04-18 17:07:36

2025-06-18 10:05:26

2021-05-08 09:49:07

JavaScript延遲加載
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产成人小视频 | 日本成人免费网站 | 中文字幕电影在线观看 | 日韩在线视频一区 | 一区二区三区日韩精品 | 91精品国产91久久久久久 | 91 久久 | 国产高清精品一区二区三区 | wwww.8888久久爱站网 | 一区二区三区精品视频 | 黄色一级免费 | 69av网| 欧美成人精品 | 日韩一区二区三区在线观看 | 99re在线视频 | 亚洲一区在线日韩在线深爱 | 日韩一区二区在线视频 | 99热这里 | 中文天堂在线一区 | 99久久免费精品国产免费高清 | 亚洲精视频 | 亚洲一区二区三区在线视频 | 日韩有码一区 | 国产日韩在线观看一区 | 国产三级| 在线亚洲欧美 | 在线国产一区二区 | 国产视频福利一区 | 91在线观看| 综合色在线 | 国产成人福利视频 | 亚洲成人免费在线观看 | 国产精品大片 | 欧美精品一区二区在线观看 | 91偷拍精品一区二区三区 | 在线观看国产h | 能看的av| 亚洲一区二区视频 | 欧美激情 一区 | 亚洲日本欧美 | 91精品国产一区二区三区 |