zoukankan      html  css  js  c++  java
  • jquery lazyload延迟加载技术的实现原理分析_jquery

    前言

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

    lazyload在什么场合中应用比较合适?

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

    如何实现lazyload?

    lazyload的难点在如何在适当的时候加载用户需要的资源(这里用户需要的资源指该资源呈现在浏览器可视区域)。因此我们需要知道几点信息来确定目标是否已呈现在客户区,其中包括:

    • 可视区域相对于浏览器顶端位置;
    • 待加载资源相对于浏览器顶端位置。

    在得到以上两点数据后,通过如下函数,便可得出某对象是否在浏览器可视区域了。
    返回浏览器的可视区域位置 

    复制代码 代码如下:

    // 返回浏览器的可视区域位置 
    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, 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, 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) < w1 && Math.abs(tc1 - tc2) < h1 ; 


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

    复制代码 代码如下:

    <div style="100px; height:3000px"></div> 
    <div id="div1" style="50px; height:50px; background:red; position:absolute; top:1000px"> 
    </div> 
    复制代码 代码如下:

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

    }; 


    我们只需要在弹出窗口的地方加载我们需要的资源。 
    这里值得注意的是 : 目标对象呈现在客户区域时,会随着滚动而不断的弹出窗口。因此我们需要在弹出第一个窗口后取消对该区域的监测,这里用一个数组来收集需要监测的对象,同时将监测的逻辑抽出来。同时需要注意 onscroll事件和onresize事件都会改变游览器可视区域信息,因此在该类事件触发后需要重新计算,这里用autocheck()函数实现。 
    增加元素 : 

    复制代码 代码如下:

    <div id="div2" style="50px; height:50px; background:blue; position:absolute; top:2500px"> 
    复制代码 代码如下:

    // 比较某个子区域是否呈现在浏览器区域 
    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(); 

    以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索lazyload 延迟加载 lazyload图片延迟加载、lazyload延迟加载效果、lazyload 延迟加载js、lazyload 延迟时间、jquery.lazyload,以便于您获取更多的相关知识。

  • 相关阅读:
    Activiti流程实例
    Activiti使用步骤 (IDEA)
    工作流简介
    并发编程常见面试题
    navicat自动备份数据,可实现每天定时备份
    MySQL, SQLite 和 PostgreSQL 关于information_schema 的一些查询(表结构,表信息,库信息....)
    GIS相关网站下载全国的GeoJSON格式数据可以到区县级数据
    GIS当中使用uDig打开shp图层,并查看数据结果
    解决Failed to execute goal org.apache.maven.plugins 错误,JDK版本不一致
    Maven插件maven-assembly-plugin进行打包部署
  • 原文地址:https://www.cnblogs.com/yzadd/p/6494607.html
Copyright © 2011-2022 走看看