Maison interface Web js tutoriel javascript 延迟加载技术(lazyload)简单实现_javascript技巧

javascript 延迟加载技术(lazyload)简单实现_javascript技巧

May 16, 2016 pm 06:11 PM
延迟加载

1.前言
  懒加载技术(简称lazyload)并不是新技术, 它是js程序员对网页性能优化的一种方案.lazyload的核心是按需加载.在大型网站中都有lazyload的身影,例如谷歌的图片搜索页,迅雷首页,淘宝网,QQ空间等.因此掌握lazyload技术是个不错的选择,可惜jquery插件lazy load官网(http://www.appelsiini.net/projects/lazyload)称不支持新版浏览器。

2.lazyload在什么场合中应用比较合适?
  涉及到图片,falsh资源 , iframe, 网页编辑器(类似FCK)等占用较大带宽,且这些模块暂且不在浏览器可视区内,因此可以使用lazyload在适当的时候加载该类资源.避免网页打开时加载过多资源,让用户等待太久.

3.如何实现lazyload?
  lazyload的难点在如何在适当的时候加载用户需要的资源(这里用户需要的资源指该资源呈现在浏览器可视区域)。因此我们需要知道几点信息来确定目标是否已呈现在客户区,其中包括:
    1.可视区域相对于浏览器顶端位置
    2.待加载资源相对于浏览器顶端位置.
  在得到以上两点数据后,通过如下函数,便可得出某对象是否在浏览器可视区域了.

复制代码 代码如下:

  //返回浏览器的可视区域位置
   function getClient(){
     var l,t,w,h;
     l = document.documentElement.scrollLeft || document.body.scrollLeft;
     t = document.documentElement.scrollTop || document.body.scrollTop;
     w = document.documentElement.clientWidth;
     h = document.documentElement.clientHeight;
     return {'left':l,'top':t,'width':w,'height':h} ;
   }
  //返回待加载资源位置
   function getSubClient(p){
     var l = 0,t = 0,w,h;
     w = p.offsetWidth ;
     h = p.offsetHeight;
    while(p.offsetParent){
    l += p.offsetLeft ;
     t += p.offsetTop ;
     p = p.offsetParent;
  }
  return {'left':l,'top':t,'width':w,'height':h } ;
}

  其中 函数 getClient()返回浏览器客户区区域信息,getSubClient()返回目标模块区域信息。此时确定目标模块是否出现在客户区实际上是确定如上两个矩形是否相交.
复制代码 代码如下:

  //判断两个矩形是否相交,返回一个布尔值
   function intens(rec1,rec2){
     var lc1,lc2,tc1,tc2,w1,h1;
     lc1 = rec1.left + rec1.width / 2;
     lc2 = rec2.left + rec2.width / 2;
    tc1 = rec1.top + rec1.height / 2 ;
     tc2 = rec2.top + rec2.height / 2 ;
     w1 = (rec1.width + rec2.width) / 2 ;
     h1 = (rec1.height + rec2.height) / 2;
     return Math.abs(lc1 - lc2)    }

  现在基本上可以实现延时加载了,接下来,我们在 window.onscroll 事件中编写一些代码监控目标区域是否呈现在客户区.
复制代码 代码如下:

  

  

  

   var d1 = document.getElementById("d1");
   window.onscroll = function(){
     var prec1 = getClient();
    var prec2 = getSubClient(d1);
     if(intens(prec1,prec2)){
       alert("true")
       }
  }

  我们只需要在弹出窗口的地方加载我们需要的资源.
  这里值得注意的是:目标对象呈现在客户区域时,会随着滚动而不断的弹出窗口.因此我们需要在弹出第一个窗口后取消对该区域的监测,这里用一个数组来收集需要监测的对象。还需要注意:因为onscroll事件和onresize事件都会改变游览器可视区域信息,因此在该类事件触发后需要重新计算目标对象是否在可视区域,这里用autocheck()函数实现.(迅雷首页的lazyload没有在onresize事件中重新计算目标对象是否在浏览器可视区域,因此如果先将浏览器窗口缩小到一定尺寸后滚动到需要加载图片的区域后点击最大化,图片加载不出来,呵呵,以后需要注意了).

  增加元素:

复制代码 代码如下:

   //比较某个子区域是否呈现在浏览器区域
  function jiance(arr,prec1,callback){
   var prec2;
   for(var i = arr.length - 1 ; i >= 0 ;i--){
     if(arr[i]){
     prec2 = getSubClient(arr[i]);
     if(intens(prec1,prec2)){
      callback(arr[i]);
       //加载资源后,删除监测
        delete arr[i];
      }
    }
   }
  }
  //检测目标对象是否出现在客户区
  function autocheck(){
     var prec1 = getClient();
    jiance(arr,prec1,function(obj){
      //加载资源...
     alert(obj.innerHTML)
    })
  }
  //子区域一
   var d1 = document.getElementById("d1");
   //子区域二
  var d2 = document.getElementById("d2");
   //需要按需加载区域集合
  var arr = [d1,d2];
   window.onscroll = function(){
     //重新计算
     autocheck();
  }
  window.onresize = function(){
     //重新计算
     autocheck();
  }

  现在我们只需要在弹窗的地方加载我们需要的资源了.源码就不贴出来了.如果需要的朋友,或着存在疑问的地方,可以联系我.
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelle est l'architecture et le principe de fonctionnement de Spring Data JPA ? Quelle est l'architecture et le principe de fonctionnement de Spring Data JPA ? Apr 17, 2024 pm 02:48 PM

SpringDataJPA est basé sur l'architecture JPA et interagit avec la base de données via le mappage, l'ORM et la gestion des transactions. Son référentiel fournit des opérations CRUD et les requêtes dérivées simplifient l'accès à la base de données. De plus, il utilise le chargement paresseux pour récupérer les données uniquement lorsque cela est nécessaire, améliorant ainsi les performances.

Quelle est la signification originale des liens dynamiques et des liens statiques sous Linux ? Quelle est la signification originale des liens dynamiques et des liens statiques sous Linux ? Feb 05, 2024 pm 05:45 PM

Comme d'habitude, posons quelques questions : Pourquoi les liens dynamiques ? Comment faire des liens dynamiques ? Qu’est-ce que la technologie de code indépendante de l’adresse ? Qu’est-ce que la technologie de liaison retardée ? Comment créer des liens explicites pendant l'exécution du programme ? Pourquoi des liens dynamiques ? L'émergence des liens dynamiques vise à résoudre certains défauts des liens statiques : économie de mémoire et d'espace disque : comme le montre la figure ci-dessous, Program1 et Program2 contiennent deux modules, Program1.o et Program2.o respectivement, et ils nécessitent tous deux la bibliothèque Lib. o module. Dans le cas d'une liaison statique, les deux fichiers cibles utilisent le module Lib.o, ils ont donc des copies dans les fichiers exécutables Program1 et program2 générés par le lien et exécutés en même temps.

Conseils d'optimisation des performances Java JPA : faites voler votre application Conseils d'optimisation des performances Java JPA : faites voler votre application Feb 19, 2024 pm 09:03 PM

Mots-clés de l'article : Optimisation des performances JavaJPA Gestion des entités ORM JavaJPA (JavaPersistance API) est un framework de mappage objet-relationnel (ORM) qui vous permet d'utiliser des objets Java pour exploiter les données dans la base de données. JPA fournit une API unifiée pour interagir avec les bases de données, vous permettant d'utiliser le même code pour accéder à différentes bases de données. De plus, JPA prend également en charge des fonctionnalités telles que le chargement paresseux, la mise en cache et la détection des données sales, qui peuvent améliorer les performances des applications. Cependant, si elles sont mal utilisées, les performances JPA peuvent devenir un goulot d'étranglement pour votre application. Voici quelques problèmes de performances courants : Problème de requête N+1 : lorsque vous utilisez des requêtes JPQL dans votre application, vous pouvez rencontrer des problèmes de requête N+1. Dans ce genre de

Comment Hibernate optimise-t-il les performances des requêtes de base de données ? Comment Hibernate optimise-t-il les performances des requêtes de base de données ? Apr 17, 2024 pm 03:00 PM

Les conseils pour optimiser les performances des requêtes Hibernate incluent : l'utilisation du chargement différé pour différer le chargement des collections et des objets associés ; l'utilisation du traitement par lots pour combiner les opérations de mise à jour, de suppression ou d'insertion ; l'utilisation du cache de deuxième niveau pour stocker les objets fréquemment interrogés en mémoire à l'aide de connexions externes HQL ; , récupérer les entités et leurs entités associées ; optimiser les paramètres de requête pour éviter le mode de requête SELECTN+1 ; utiliser des curseurs pour récupérer des données massives en blocs ; utiliser des index pour améliorer les performances de requêtes spécifiques.

Décoder les goulots d'étranglement des performances de Laravel : les techniques d'optimisation entièrement révélées ! Décoder les goulots d'étranglement des performances de Laravel : les techniques d'optimisation entièrement révélées ! Mar 06, 2024 pm 02:33 PM

Décoder les goulots d'étranglement des performances de Laravel : les techniques d'optimisation entièrement révélées ! Laravel, en tant que framework PHP populaire, offre aux développeurs des fonctions riches et une expérience de développement pratique. Cependant, à mesure que la taille du projet augmente et que le nombre de visites augmente, nous pouvons être confrontés au défi des goulots d'étranglement en matière de performances. Cet article approfondira les techniques d'optimisation des performances de Laravel pour aider les développeurs à découvrir et à résoudre les problèmes de performances potentiels. 1. Optimisation des requêtes de base de données à l'aide du chargement différé d'Eloquent Lorsque vous utilisez Eloquent pour interroger la base de données, évitez

Que faire si l'image HTML est trop grande Que faire si l'image HTML est trop grande Apr 05, 2024 pm 12:24 PM

Voici quelques façons d'optimiser les images HTML trop volumineuses : Optimiser la taille du fichier image : Utilisez un outil de compression ou un logiciel de retouche d'image. Utilisez des requêtes multimédias : redimensionnez dynamiquement les images en fonction de l'appareil. Implémentez le chargement différé : chargez l'image uniquement lorsqu'elle entre dans la zone visible. Utilisez un CDN : distribuez des images sur plusieurs serveurs. Utiliser un espace réservé pour l’image : affichez une image d’espace réservé pendant le chargement de l’image. Utiliser des vignettes : affiche une version plus petite de l'image et charge l'image en taille réelle en un clic.

Comment empêcher l'événement de chargement d'iframe Comment empêcher l'événement de chargement d'iframe Feb 19, 2024 am 08:02 AM

Comment empêcher les événements de chargement d'iframe Dans le développement Web, nous utilisons souvent des balises iframe pour intégrer d'autres pages ou contenus Web. Par défaut, lorsque le navigateur charge une iframe, l'événement de chargement est déclenché. Cependant, dans certains cas, nous pouvons souhaiter retarder le chargement d'une iframe, ou empêcher complètement l'événement de chargement. Dans cet article, nous explorerons comment y parvenir à travers des exemples de code. 1. Retarder le chargement de l'iframe Si vous souhaitez retarder le chargement de l'iframe, nous pouvons utiliser

Recommandations de projets open source Java JPA : Injectez une nouvelle vitalité à votre projet Recommandations de projets open source Java JPA : Injectez une nouvelle vitalité à votre projet Feb 20, 2024 am 09:09 AM

Dans le domaine de la programmation Java, JPA (JavaPersistence API), en tant que framework de persistance populaire, offre aux développeurs un moyen pratique d'exploiter des bases de données relationnelles. En utilisant JPA, les développeurs peuvent facilement conserver les objets Java dans la base de données et récupérer les données de la base de données, améliorant ainsi considérablement l'efficacité et la maintenabilité du développement d'applications. Cet article sélectionne soigneusement 10 projets open source JavaJPA de haute qualité, couvrant une variété de fonctions et de scénarios d'application différents, dans le but de fournir aux développeurs plus d'inspiration et de solutions pour les aider à créer des applications plus efficaces et plus fiables. Ces projets incluent : SpringDataJPA : springDataJPA est Spr

See all articles