最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • js中延迟加载和预加载 | 七日打卡

    正文概述 掘金(Yushia)   2021-01-14   487

    一、延迟加载(懒加载)

    原理: 当在真正需要数据的时候,才真正执行数据加载操作。

    目的: 延迟加载机制是为了避免一些无谓的性能开销而提出来的

    实现延迟加载的几种方法

    1. 让 js 最后加载

    使用方法: 把 js 外部引入的文件放到页面底部

    用途: 让 js 最后引入,从而加快页面加载速度

    说明:

    流览器之所以会采用同步模式,通常加载 js 文件或者放<script>标签都在结构最后面,也是因为它会阻止浏览器后续操作的原因,所以放在后面,当页面结构和样式全部渲染完成再执行 js,提升用户体验

    2. defer 属性

    使用方法:<script>标签定义了 defer属性

    用途: 让脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕之后再执行

    <!DOCTYPE html>
    <html>
    <head>
        <script src="test1.js" defer="defer"></script>
        <script src="test2.js" defer="defer"></script>
    </head>
    <body>
    <!-- 这里放内容 -->
    </body>
    </html>
    

    说明:

    1. 虽然<script>元素放在了<head>元素中,但包含的脚本将延迟浏览器遇到</html>标签后再执行。

    2. 当浏览器解析到 script 脚本,有 defer 时,浏览器会并行下载有 defer 属性的 script,而不会阻塞页面后续处理。

    3. 所有的 defer 脚本保证是按顺序依次执行的。(但实际上延迟脚本并不一定会按照顺序执行,因此最好只包含一个延迟脚本)

    4. defer 属性只适用于外部脚本文件

    3. async 属性

    使用方法:<script>标签定义了 async属性

    用途: 不让页面等待脚本下载和执行,从而异步加载页面其他内容。

    <!DOCTYPE html>
    <html>
    <head>
        <script src="test1.js" async></script>
        <script src="test2.js" async></script>
    </head>
    <body>
    <!-- 这里放内容 -->
    </body>
    </html>
    

    浏览器会立即下载脚本,但不妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本。加载和渲染后续文档元素的过程和 main.js 的加载与执行并行进行,这个过程是异步的。它们将在 onload 事件之前完成。

    说明:

    1. 浏览器会立即下载脚本,但不妨碍页面中的其他操作,加载和渲染后续文档元素的过程和脚本的加载与执行并行进行

    2. 这个过程是异步的,它们将在 onload 事件之前完成

    3. 所有的 defer 脚本不能控制加载的顺序。。

    4. asyncr 属性只适用于外部脚本文件

    4. 动态创建 DOM 方式

    //这些代码应被放置在</body>标签前(接近HTML文件底部)
    <script type="text/javascript">
       function downloadJSAtOnload() {
           varelement = document.createElement("script");
           element.src = "defer.js";
           document.body.appendChild(element);
       }
       if (window.addEventListener)
          window.addEventListener("load",downloadJSAtOnload, false);
       else if (window.attachEvent)
          window.attachEvent("onload",downloadJSAtOnload);
       else
          window.onload =downloadJSAtOnload;
    </script>
    

    5. 使用 jquery 的 getScript 方法

    使用方法:

    Query.getScript(url,success(response,status))

    url(必写):将要请求的 URL 字符串

    success(response,status)(可选):规定请求成功后执行的回调函数。

    其中的参数   response - 包含来自请求的结果数据

    status - 包含请求的状态("success", "notmodified", "error", "timeout" 或 "parsererror")

    用途: 通过 HTTP GET 请求载入并执行 JavaScript 文件。

    //加载并执行 test.js:
    $.getScript("test.js");
    //加载并执行 test.js ,成功后显示信息
    $.getScript("test.js", function(){
      alert("Script loaded and executed.");
    });
    

    6.使用 setTimeout 延迟方法的加载时间

    用途: 延迟加载 js 代码,给网页加载留出时间

    <script type="text/javascript">
      function A(){
        $.post("/lord/login",{name:username,pwd:password},function(){
          alert("Hello World!");
        })
      }
      $(function (){
        setTimeout("A()",1000); //延迟1秒
      })
    </script>
    

    常用实例 - 图片懒加载

    原理: 一张图片就是一个<img>标签,浏览器是否发起请求图片是根据<img>的 src 属性,所以实现懒加载的关键就是,在图片没有进入可视区域时,先不给<img>的 src 赋值,这样浏览器就不会发送请求了,等到图片进入可视区域再给 src 赋值。

    <img class="lazy" src="img/loading.gif" lazy-src="img/pic1.jpg" >
    <img class="lazy" src="img/loading.gif" lazy-src="img/pic2.jpg" >
    
    function lazyload(){
    	var visible;
    	$('img').each(function () {
    		if( typeof($(this).attr("lazy-src"))!="undefined" ){ // 判断图片是否需要懒加载
    			visible = $(this).offset().top - $(window).scrollTop(); //图片距离顶部的距离
    			if ((visible > 0) && (visible < $(window).height())) {// 判断图片是否在可视区域
    			    visible = true;// 图片在可视区域
    			} else {
    			    visible = false;// 图片不在可视区域
    			}
    			if (visible) {
    			    $(this).attr('src', $(this).attr('lazy-src'));
    			}
    		}
    	});
    }
     // 打开页面触发函数
    	lazyload();
    	// 滚屏时触发函数
    	window.onscroll =function(){
    		lazyload(imgs);
    	}
    

    二、 预加载

    原理: 提前加载图片,当用户需要查看时可直接从本地缓存中渲染

    目的: 牺牲前端性能,换取用户体验,使用户的操作得到最快的反映。

    实现预加载的几种方法

    1. css 实现

    原理: 可通过 CSS 的background 属性 将图片预加载到屏幕外的背景上。只要这些图片的路径保持不变 ,当它们在 Web 页面的其他地方被调用时,浏览器就会在渲染过程中使用预加载(缓存)的图片。简单、高效,不需要任何 JavaScript。

    #preload-01 { background: url(https://img.qiyuandi.com/images/5/jszyckzce5awpmsk.jpg) no-repeat -9999px -9999px; }
    
    #preload-02 { background: url(https://img.qiyuandi.com/images/5/jszyck3ndw21ehwl.jpg) no-repeat -9999px -9999px; }
    
    #preload-03 { background: url(https://img.qiyuandi.com/images/5/jszycwkn1dh0sfmb.jpg) no-repeat -9999px -9999px; }
    

    2. js 预加载图片

    原理: 通过写函数进行预加载。将该脚本封装入一个函数中,并使用 addLoadEvent(),延迟预加载时间,直到页面加载完毕。

    function preloader() {
        if (document.images) {
            var img1 = new Image();
            var img2 = new Image();
            var img3 = new Image();
            img1.src = "https://img.qiyuandi.com/images/5/jszyccb31yc5idnn.jpg";
            img2.src = "https://img.qiyuandi.com/images/5/jszyc1r4bljvhz2z.jpg";
            img3.src = "https://img.qiyuandi.com/images/5/jszyczsymqdmqdje.jpg";
        }
    }
    function addLoadEvent(func) {
        var oldonload = window.onload;
        if (typeof window.onload != 'function') {
            window.onload = func;
        } else {
            window.onload = function() {
                if (oldonload) {
                    oldonload();
                }
                func();
            }
        }
    }
    addLoadEvent(preloader);
    

    3. 使用 ajax 实现预加载

    原理: 使用 Ajax 实现图片预加载的方法,利用 DOM,不仅仅预加载图片,还会预加载 CSS、JavaScript 等相关的东西

    window.onload = function() {
        setTimeout(function() {
            // XHR to request a JS and a CSS
            var xhr = new XMLHttpRequest();
            xhr.open('GET', 'http://domain.tld/preload.js');
            xhr.send('');
            xhr = new XMLHttpRequest();
            xhr.open('GET', 'http://domain.tld/preload.css');
            xhr.send('');
            // preload image
            new Image().src = "https://img.qiyuandi.com/images/5/jszychsh5bywg4qq.jpg";
        }, 1000);
    };
    

    上面代码预加载了“preload.js”、“preload.css”和“preload.png”。1000 毫秒的超时是为了防止脚本挂起,而导致正常页面出现功能问题。

    三、 懒加载与预加载的对比

    1、概念

    延迟加载也叫懒加载: 当在真正需要数据的时候,才真正执行数据加载操作。

    预加载:提前加载,当用户需要查看时可直接从本地缓存中渲染

    2、区别

    • 两种技术的本质:两者的行为相反,一个是提前加载,一个是迟缓甚至不加载。

    • 懒加载会对前端有一定的缓解压力作用,预加载则会增加前端的压力。

    3、意义

    懒加载的主要目的是优化前端性能,减少请求数或延迟请求数。

    预加载是牺牲前端性能,换取用户体验,使用户的操作得到最快的反映。

    四、 参考资料

    【1】www.jb51.net/article/154…

    【2】 www.jb51.net/article/575…


    起源地下载网 » js中延迟加载和预加载 | 七日打卡

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元