国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
JS實(shí)現(xiàn)圖片預(yù)加載功能

JS實(shí)現(xiàn)圖片預(yù)加載功能 

2009/12/15

網(wǎng)站開發(fā)時(shí)經(jīng)常需要在某個(gè)頁面需要實(shí)現(xiàn)對(duì)大量圖片的瀏覽,如果考慮流量的話,大可以像pconline一樣每個(gè)頁面只顯示一張圖片,讓用戶每看一張圖片就需要重新下載一下整個(gè)頁面。不過,在web2.0時(shí)代,更多人愿意用javascript來實(shí)現(xiàn)一個(gè)圖片瀏覽器,讓用戶無需等待過長的時(shí)間就能看到其他圖片。

知道了一張圖片的地址,需要把它在一個(gè)固定大小的html容器(可以是div等)里邊顯示出來,最重要的當(dāng)然是需要知道這張即將顯示的圖片的寬和高,然后再結(jié)合容器的寬和高,按照一定的縮放比例使圖片顯示出來。因此,實(shí)現(xiàn)圖片預(yù)加載就成為圖片瀏覽器的核心功能了。

做過圖片翻轉(zhuǎn)效果的朋友其實(shí)都知道,要讓圖片輪換的時(shí)候不出現(xiàn)等待,最好是先讓圖片下載到本地,讓瀏覽器緩存起來。這時(shí),一般都會(huì)用到j(luò)s里邊的Image對(duì)象。一般的手段無非這樣:

function preLoadImg(url) {
var img = new Image();
img.src
= url;
}

通過調(diào)用preLoadImg函數(shù),傳入圖片的url,就能使圖片預(yù)先下載下來了。實(shí)際上,這里用到的預(yù)下載功能也和這基本一致。圖片預(yù)下載下來后,通過 img的width和height屬性,就能知道圖片的寬和高了。但是需要考慮到,在做圖片瀏覽器功能時(shí),圖片都是實(shí)時(shí)顯示的。比如你點(diǎn)了顯示的按鈕,這個(gè)時(shí)候才會(huì)調(diào)用上邊類似的代碼來加載圖片。因此,如果你直接用img.width的時(shí)候,圖片還沒有完全下載下來。因此,需要用一些異步的方法,等到圖片下載完畢的時(shí)候才會(huì)再對(duì)img的width和height進(jìn)行調(diào)用。

實(shí)現(xiàn)這樣的異步方法實(shí)際上不難,圖片的下載完畢事件也很簡單,就是簡單的onload事件。因此,我們可以寫出下面的代碼:
function loadImage(url, callback) {
  
var img = new Image();
   img.src
= url;

   img.onload
= function()
{ //圖片下載完畢時(shí)異步調(diào)用callback函數(shù)。
     callback.call(img);   // 將callback函數(shù)this指針切換為img。
   }
;
}


好了,再來寫一個(gè)測(cè)試用例。
function imgLoaded(){
   alert(this.width);
}
<input type="button" value="loadImage" onclick="loadImage(''aaa.jpg'',imgLoaded)"/>

在firefox中測(cè)試一下,發(fā)現(xiàn)不錯(cuò),果然和預(yù)想的效果一樣,在圖片下載后,就會(huì)彈出圖片的寬度來。無論點(diǎn)擊多少次或者刷新結(jié)果都一樣。

不過,做到這一步,先別高興太早——還需要考慮一下瀏覽器的兼容性,于是,趕緊到ie里邊測(cè)試一下。沒錯(cuò),同樣彈出了圖片的寬度。但是,再點(diǎn)擊load的時(shí)候,情況就不一樣了,什么反應(yīng)都沒有了。刷新一下,也同樣如此。

經(jīng)過對(duì)多個(gè)瀏覽器版本的測(cè)試,發(fā)現(xiàn)ie6、opera都會(huì)這樣,而firefox和safari則表現(xiàn)正常。其實(shí),原因也挺簡單的,就是因?yàn)闉g覽器的緩存了。當(dāng)圖片加載過一次以后,如果再有對(duì)該圖片的請(qǐng)求時(shí),由于瀏覽器已經(jīng)緩存住這張圖片了,不會(huì)再發(fā)起一次新的請(qǐng)求,而是直接從緩存中加載過來。對(duì)于 firefox和safari,它們視圖使這兩種加載方式對(duì)用戶透明,同樣會(huì)引起圖片的onload事件,而ie和opera則忽略了這種同一性,不會(huì)引起圖片的onload事件,因此上邊的代碼在它們里邊不能得以實(shí)現(xiàn)效果。

怎么辦呢?最好的情況是Image可以有一個(gè)狀態(tài)值表明它是否已經(jīng)載入成功了。從緩存加載的時(shí)候,因?yàn)椴恍枰却?,這個(gè)狀態(tài)值就直接是表明已經(jīng)下載了,而從http請(qǐng)求加載時(shí),因?yàn)樾枰却螺d,這個(gè)值顯示為未完成。這樣的話,就可以搞定了。

經(jīng)過一些分析,終于發(fā)現(xiàn)一個(gè)為各個(gè)瀏覽器所兼容的Image的屬性——complete。所以,在圖片onload事件之前先對(duì)這個(gè)值做一下判斷即可。最后,代碼變成如下的樣子:
function loadImage(url, callback) {
    
var img = new Image(); //創(chuàng)建一個(gè)Image對(duì)象,實(shí)現(xiàn)圖片的預(yù)下載
     img.src = url;
   
    
if (img.complete)
{ // 如果圖片已經(jīng)存在于瀏覽器緩存,直接調(diào)用回調(diào)函數(shù)
         callback.call(img);
        
return; // 直接返回,不用再處理onload事件
     }


     img.onload
= function ()
{ //圖片下載完畢時(shí)異步調(diào)用callback函數(shù)。
         callback.call(img);//將回調(diào)函數(shù)的this替換為Image對(duì)象
     }
;
}
;

經(jīng)過這么一番折騰,總算是讓各個(gè)瀏覽器都能滿足我們的目標(biāo)了。雖然代碼很簡單,但是卻把圖片瀏覽器中最核心的問題解決掉了,接下來你所要做的,僅僅是圖片如何呈現(xiàn)的問題了
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
javaScript & jquery完美判斷圖片是否加載完畢
妙用jquery.scrollLoading.js插件,加快網(wǎng)頁的顯示速度
怎么在html的<img src="">中調(diào)用js的函數(shù)或者js變量來指定圖片路徑?
[前端]圖片預(yù)加載方法
Js文件函數(shù)中調(diào)用另一個(gè)Js文件函數(shù)的方法
瀏覽器緩存的研究 - bluesky - JavaEye技術(shù)網(wǎng)站
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服