Heim  >  Artikel  >  Web-Frontend  >  Zusammenfassung der Methoden zum Implementieren des verzögerten Ladens von Bildern in Javascript (drei Methoden)_Javascript-Kenntnisse

Zusammenfassung der Methoden zum Implementieren des verzögerten Ladens von Bildern in Javascript (drei Methoden)_Javascript-Kenntnisse

WBOY
WBOYOriginal
2016-05-16 15:42:041070Durchsuche

Wenn die Seite viele Bilder enthält, werden beim Scrollen zur entsprechenden Zeile sofort die Bilder in der aktuellen Zeile geladen. Auf diese Weise wird die Seite nur mit den Bildern im sichtbaren Bereich geöffnet. und Andere versteckte Bilder werden nicht geladen, was das Laden der Seite beschleunigt. Bei längeren Seiten ist diese Lösung besser. Das Prinzip ist folgendes: Die Bilder unterhalb des sichtbaren Bereichs der Seite werden erst geladen, wenn der Benutzer zum Bildspeicherort scrollt und dann lädt. Welche Vorteile bietet dies? ——Wenn die Seite über mehrere Bildschirme mit Inhalten verfügt, ist es möglich, dass der Benutzer nur den Inhalt der ersten paar Bildschirme sieht. Auf diese Weise können wir nur die Bilder laden, die der Benutzer sehen muss, und die dadurch verursachte Belastung reduzieren Der Server sendet Bilddateien an den Browser des Benutzers. Hier sind drei Schritte: Diese Methode führt Sie in js ein, um das verzögerte Laden von Bildern zu implementieren.

JS-Implementierung der Methode 1 zum verzögerten Laden von Bildern:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
 <head> 
  <title>lazyImage2.html</title> 
  <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
  <meta http-equiv="description" content="this is my page"> 
  <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
  <!--<link rel="stylesheet" type="text/css" href="./styles.css" mce_href="styles.css">--> 
 </head> 
 <body style="text-align:center" mce_style="text-align:center"> 
 <p>  </p><p> </p><p> </p><p> </p><p> </p> 
  <div style="height:1290px;width:800px;border:1px;background:gray;"></div> 
  <div style="height:150px;width:800px;border:1px;background:green;"></div> 
  <img class="lazy" src="images/sprite.gif" mce_src="images/sprite.gif" alt="images/lazyloadImg.jpg" /> 
  <script type="text/javascript"><!-- 
      var temp = -1;//用来判断是否是向下滚动(向上滚动就不需要判断延迟加载图片了) 
      window.onscroll = function() { 
      var imgElements = document.getElementsByTagName("img"); 
      var lazyImgArr = new Array(); 
      var j = 0; 
      for(var i=0; i<imgElements.length; i++) { 
       if(imgElements[i].className == "lazy"){ 
        lazyImgArr[j++] = imgElements[i]; 
       } 
      } 
              var scrollHeight = document.body.scrollTop;//滚动的高度 
      var bodyHeight = document.body.offsetHeight;//body(页面)可见区域的总高度 
      if(temp < scrollHeight) {//为true表示是向下滚动,否则是向上滚动,不需要执行动作。 
       for(var k=0; k<lazyImgArr.length; k++) { 
       var imgTop = lazyImgArr[k].offsetTop;//1305(图片纵坐标) 
       if((imgTop - scrollHeight) <= bodyHeight) { 
        lazyImgArr[k].src = lazyImgArr[k].alt; 
        lazyImgArr[k].className = "notlazy" 
               } 
      } 
      temp = scrollHeight; 
     } 
    }; 
// --></script> 
 </body> 
</html>

JS-Methode zum Implementieren des verzögerten Ladens von Webseitenbildern:

Bevor ich den Code veröffentliche, möchte ich Ihnen das Prinzip von js zum Implementieren des verzögerten Ladens von Bildern erläutern.

Umsetzungsprinzip:

Ändern Sie alle Bilder, die verzögert geladen werden müssen, in das folgende Format:

<img lazy_src="图片路径" border="0"/>

Wenn die Seite dann geladen wird, speichern Sie alle Bilder mit lazy_src in einem Array, berechnen Sie dann den oberen Rand des sichtbaren Bereichs beim Scrollen und machen Sie dann den oberen Rand der verzögert geladenen Bilder kleiner als den aktuell sichtbaren Bereich (d. h image Der src-Wert des im sichtbaren Bereich erscheinenden Bildes wird durch lazy_src (Bild laden) ersetzt:

JS-Code:

lazyLoad = (function() {
  var map_element = {};
  var element_obj = [];
  var download_count = 0;
  var last_offset = -1;
  var doc_body;
  var doc_element;
  var lazy_load_tag;
  function initVar(tags) {
    doc_body = document.body;
    doc_element = document.compatMode == 'BackCompat' &#63; doc_body : document.documentElement;
    lazy_load_tag = tags || ["img", "iframe"];
  };
  function initElementMap() {
    var all_element = [];
    //从所有相关元素中找出需要延时加载的元素 
    for (var i = 0,
len = lazy_load_tag.length; i < len; i++) {
      var el = document.getElementsByTagName(lazy_load_tag[i]);
      for (var j = 0,
len2 = el.length; j < len2; j++) {
        if (typeof (el[j]) == "object" && el[j].getAttribute("lazy_src")) {
          element_obj.push(all_element[key]);
        }
      }
    }
    for (var i = 0,
len = element_obj.length; i < len; i++) {
      var o_img = element_obj[i];
      var t_index = getAbsoluteTop(o_img); //得到图片相对document的距上距离 
      if (map_element[t_index]) {
        map_element[t_index].push(i);
      } else {
        //按距上距离保存一个队列 
        var t_array = [];
        t_array[0] = i;
        map_element[t_index] = t_array;
        download_count++; //需要延时加载的图片数量 
      }
    }
  };
  function initDownloadListen() {
    if (!download_count) return;
    var offset = (window.MessageEvent && !document.getBoxObjectFor) &#63; doc_body.scrollTop : doc_element.scrollTop;
    //可视化区域的offtset=document的高+ 
    var visio_offset = offset + doc_element.clientHeight;
    if (last_offset == visio_offset) {
      setTimeout(initDownloadListen, 200);
      return;
    }
    last_offset = visio_offset;
    var visio_height = doc_element.clientHeight;
    var img_show_height = visio_height + offset;
    for (var key in map_element) {
      if (img_show_height > key) {
        var t_o = map_element[key];
        var img_vl = t_o.length;
        for (var l = 0; l < img_vl; l++) {
          element_obj[t_o[l]].src = element_obj[t_o[l]].getAttribute("lazy_src");
        }
        delete map_element[key];
        download_count--;
      }
    }
    setTimeout(initDownloadListen, 200);
  };
  function getAbsoluteTop(element) {
    if (arguments.length != 1 || element == null) {
      return null;
    }
    var offsetTop = element.offsetTop;
    while (element = element.offsetParent) {
      offsetTop += element.offsetTop;
    }
    return offsetTop;
  }
  function init(tags) {
    initVar(tags);
    initElementMap();
    initDownloadListen();
  };
  return {
    init: init
  }
})();

Verwendung: Ändern Sie den Quellcode des Bildes, das verzögert auf die Seite geladen werden muss, in lazy_src, fügen Sie dann die oben genannten js am Ende des Körpers ein und rufen Sie dann auf: lazyLoad.init();
Zur Verdeutlichung können Sie Firebug verwenden, um zu überprüfen, ob das Bild verzögert geladen wird.

Außerdem:

Wenn es auf Ihrer Seite eine Spalte mit Inhaltsumschaltung gibt, werden die Bilder im Inhalt beim Umschalten möglicherweise nicht angezeigt. Die Lösung besteht darin, die Bilder während des Inhalts separat zu laden, wie zum Beispiel:

///切换内容的代码…
chlid.find("img[init_src]").each(function(){ 
  $(this).attr("src",$(this).attr("init_src")); 
  $(this).removeAttr("init_src"); 
 });

Ursprüngliche js-Implementierung der dritten Methode zum verzögerten Laden von Bildern:

 <!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>通过原生js延迟加载图片</title>
<style type="text/css">
    div{width:100px;height:100px;background:#F00;margin-bottom:30px}
</style>
</head>
<body>
  <div><img data-url="http://www.pokemon.name/w/image/Sprites/PDW/001.png
  " src="a.gif" /></div>
  <div><img data-url="http://www.pokemon.name/w/image/Sprites/PDW/002.png
  " src="a.gif" /></div>
  <div><img data-url="http://www.pokemon.name/w/image/Sprites/PDW/003.png
  " src="a.gif" /></div>
  <div><img data-url="http://www.pokemon.name/w/image/Sprites/PDW/004.png
  " src="a.gif" /></div>
</body>
//以上图片测试时可用复制多点
<script type="text/javascript">
    (function(){
        //common
        function tagName(tagName){
            return document.getElementsByTagName(tagName);
        }
        function $(id){
            return document.getElementById(id);
        }
        function addEvent(obj,type,func){
            if(obj.addEventListener){
                obj.addEventListener(type,func,false);    
            }else if(obj.attachEvent){
                obj.attachEvent('on'+type,func);
            }
        }
        //这里可以按照需要配置些参数
        var v={
            eleGroup:null,
            eleTop:null,
            eleHeight:null,
            screenHeight:null,
            visibleHeight:null,
            scrollHeight:null,
            scrolloverHeight:null,
            limitHeight:null
        }
        //对数据进行初始化
        function init(element){
            v.eleGroup=tagName(element)
            screenHeight=document.documentElement.clientHeight;
            scrolloverHeight=document.body.scrollTop;
            for(var i=0,j=v.eleGroup.length;i<j;i++){
                if(v.eleGroup[i].offsetTop<=screenHeight && v.eleGroup[i].getAttribute('data-url')){
                    v.eleGroup[i].setAttribute('src',v.eleGroup[i].getAttribute('data-url'));
                    v.eleGroup[i].removeAttribute('data-url')
                }    
            }
        }
        function lazyLoad(){
            if(document.body.scrollTop == 0){
                limitHeight=document.documentElement.scrollTop+document.documentElement.clientHeight;
            }else{
                limitHeight=document.body.scrollTop+document.documentElement.clientHeight;
            }
            for(var i=0,j=v.eleGroup.length;i<j;i++){
                if(v.eleGroup[i].offsetTop<=limitHeight && v.eleGroup[i].getAttribute('data-url')){
                    v.eleGroup[i].src=v.eleGroup[i].getAttribute('data-url');
                    v.eleGroup[i].removeAttribute('data-url')
                }    
            }
        }
        init('img')
        addEvent(window,'scroll',lazyLoad);
    })()         
</script>
</html>

Der obige Inhalt stellt js vor, um das verzögerte Laden von Bildern über drei Methoden zu implementieren. Ich hoffe, es gefällt Ihnen.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn