js懶加載


    當我們打開一個頁面時,瀏覽器就會從上往下讀取頁面中的<img>標簽src中的地址,並且開啟線程來進行加載。

倘若用戶的網速不給力或者此頁面中的圖片太多時,就會發生每張圖片都加載了一點但是都沒有加載完成,導致最后沒有一個圖片能正常顯示。一方面讓用戶的體驗非常之差,試問誰會一直耐心的等待着頁面的加載?另一方面,加載每個圖片都要向服務器發送請求,這會增大服務器的壓力。

針對這種情況,就需要運用懶加載技術:先只加載可視窗口區域的圖片,當用戶向下拖動滾動條時再繼續加載后面的圖片(也是只加載目前可視窗口區域內的圖片)。1.這樣減少了加載時的線程數量,使可視區域內的圖片也能夠快速加載,優化了用戶體驗。2.減少了同一時間發向服務器的請求數,服務器壓力劇減。

那么我們是如何進行懶加載的呢?

我所使用的方法:在寫網頁<img>標簽時並不會將圖片的路徑放入src屬性。而是自定義一個其他的屬性eg:_src。將路徑放入這個自定義的屬性中。那么在加載頁面時,這個圖片一開始是無法加載的。而當瀏覽器的可視區域移動到此圖片上時,將_src中的路徑賦值給src屬性,並開始加載。

代碼如下:

function getFixed(obj){
  //獲取非行間屬性
  function getStyle(obj,styleName){
    if (obj.currentStyle){
      return obj.currentStyle[styleName];
    }
    else{
      return getComputedStyle(obj,null)[styleName];
    }
  }
  //要獲取圖片相對網頁頂部的距離,但圖片有被定位的父級
  var iLeft=0;
  var iTop=0;
  var oParent=obj;
  while(oParent){
    if (oParent.tagName=="HTML"){
      break;
    }
    iLeft+=oParent.offsetLeft;
    iTop+=oParent.offsetTop;
    if (oParent!=obj){
      iLeft+=parseInt(getStyle(oParent,"borderWidth"));//offsetLeft不包括邊框,因此要把邊框加上
      iTop+=parseInt(getStyle(oParent,"borderWidth"));
    }
    oParent=oParent.offsetParent;
  }
  return [iLeft,iTop];//當 break 后itop就是圖片相對網頁頂部的距離
}
window.onload=window.onscroll=function (){

  var aImg=document.getElementsByTagName("img");

  var bodyScrollTop=document.body.scrollTop||document.documentElement.scrollTop;
  var scrollBottom=bodyScrollTop+document.documentElement.clientHeight;
  for (var i=0; i<aImg.length; i++){
    if (getFixed(aImg[i])[1]<=scrollBottom){//此時說明這圖片已經在可視區域內,應該開始加載了
      aImg[i].src=aImg[i].getAttribute("_src");
    }
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM