js实现延迟加载的几种方法详解


Posted in Javascript onJanuary 19, 2019

这是一个面试经常问到的问题:js的延迟加载方法 (js的延迟加载有助于提高页面的加载速度)

主要考察对程序的性能方面是否有研究,程序的性能是一个项目不断地追求的,通常也是项目完成后需要长期做的一件事情,像腾讯QQ依然对程序的性能不断地做优化,让用户的体验更好,性能优化的核心思想就是快,可以预先准备数据(如缓存的使用),可以按需获取,可以分段获取等都是常见的优化手段。

解题思路 :

1.defer属性

<script src="file.js" defer> </script>

浏览器会并行下载 file.js和其它有 defer 属性的script,而不会阻塞页面后续处理。defer属性在IE 4.0中就实现了,超过10多年了!Firefox从 3.5 开始支持defer属性 。

注:所有的defer脚本保证是按顺序依次执行的。

2.async属性

<script src="file.js" async> </script>

async属性是HTML5新增的。作用和defer类似,但是它将在下载后尽快执行,不能保证脚本会按顺序执行。它们将在onload 事件之前完成。

Firefox3.6、Opera 10.5、IE 9和 最新的Chrome 和 Safari 都支持 async 属性。可以同时使用 async 和 defer,这样IE 4之后的所有IE 都支持异步加载。

3.动态创建DOM方式 (使用的最多)

<script type="text/javascript">
  function downloadJSAtOnload() {
   var element = 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>

PS: 这里插一句addEventListener() 也是常考的知识点之一:

    addEventListener() 方法用于向指定元素添加事件句柄。

    使用 removeEventListener() 方法来移除 addEventListener() 方法添加的事件句柄。

    语法:element.addEventListener(event, function, useCapture)

  1.         event (必须)字符串,指定事件名。注意: 不要使用 “on” 前缀。 例如,使用 “click” ,而不是使用 “onclick”。
  2.         function (必须)指定要事件触发时执行的函数。当事件对象会作为第一个参数传入函数。 事件对象的类型取决于特定的事件。例如, “click” 事件属于 MouseEvent(鼠标事件) 对象。
  3.         useCapture (可选)布尔值,指定事件是否在捕获或冒泡阶段执行。【true:事件句柄在捕获阶段执行; false:默认,事件句柄在冒泡阶段执行】
<p>该实例使用 addEventListener() 方法来向按钮添加点击事件。</p> 
<button id="myBtn">点我</button> 
<p id="demo"></p> 
<script>
document.getElementById("myBtn").addEventListener("click", function(){
  document.getElementById("demo").innerHTML = "Hello World";
});
</script>

效果如图:

js实现延迟加载的几种方法详解

4.使用Jquery的getScript()方法

$.getScript("outer.js",function(){//回调函数,成功获取文件后执行的函数
   console.log("脚本加载完成")
});

从源码可以看出,这个方法最后还是调用了jQuery.ajax()来请求了js文件的。

5.使用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>

6.让js最后加载

例如引入外部js脚本文件时,如果放入html的head中,则页面加载前该js脚本就会被加载入页面,而放入body中,则会按照页面从上倒下的加载顺序来运行javascript的代码~~~ 所以我们可以把js外部引入的文件放到页面底部,来让js最后引入,从而加快页面加载速度。

上述方法5,6也会偶尔让你收到Google页面速度测试工具的“延迟加载javascript”警告。所以这里的解决方案将是来自Google帮助页面的推荐方案。

//这些代码应被放置在</body>标签前(接近HTML文件底部) <script type="text/javascript">
  function downloadJSAtOnload() {
    var element = 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>

这段代码意思是等到整个文档加载完后,再加载外部文件“defer.js”。

使用此段代码的步骤:

  1.     复制上面代码
  2.     粘贴代码到HTML的标签前 (靠近HTML文件底部)
  3.     修改“defer.js”为你的外部JS文件名
  4.     确保你文件路径是正确的。例如:如果你仅输入“defer.js”,那么“defer.js”文件一定与HTML文件在同一文件夹下。

注意:这段代码直到文档加载完才会加载指定的外部js文件。因此,不应该把那些页面正常加载需要依赖的javascript代码放在这里。而应该将JavaScript代码分成两组。一组是因页面需要而立即加载的javascript代码,另外一组是在页面加载后进行操作的javascript代码(例如添加click事件或其他东西)。这些需等到页面加载后再执行的JavaScript代码,应放在一个外部文件,然后再引进来。

若有不足请多多指教!希望给您带来帮助!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Javascript 相关文章推荐
JavaScript自定义日期格式化函数详细解析
Jan 14 Javascript
jQuery检查元素存在性(推荐)
Sep 17 Javascript
微信小程序开发之toast提示插件使用示例
Jun 08 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
Jan 23 jQuery
详解vue 数据传递的方法
Apr 19 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
May 31 Javascript
ndm:NPM的桌面GUI应用程序
Oct 15 Javascript
ng-alain的sf如何自定义部件的流程
Jun 12 Javascript
JavaScript文档加载模式以及元素获取
Jul 28 Javascript
js在HTML的三种引用方式详解
Aug 29 Javascript
vue项目中使用rem,在入口文件添加内容操作
Nov 11 Javascript
JS原生实现轮播图的几种方法
Mar 23 Javascript
15分钟深入了解JS继承分类、原理与用法
Jan 19 #Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
Jan 19 #Javascript
js的各种数据类型判断的介绍
Jan 19 #Javascript
JavaScript实现与使用发布/订阅模式详解
Jan 19 #Javascript
Vuex中的State使用介绍
Jan 19 #Javascript
为什么要使用Vuex的介绍
Jan 19 #Javascript
Vue核心概念Getter的使用方法
Jan 18 #Javascript
You might like
笑谈配置,使用Smarty技术
2007/01/04 PHP
php操作redis缓存方法分享
2015/06/03 PHP
JavaScript高级程序设计 扩展--关于动态原型
2010/11/09 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
document.forms用法示例介绍
2014/06/26 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
JavaScript中数组slice和splice的对比小结
2016/09/22 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
Canvas 绘制粒子动画背景
2017/02/15 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
pytorch实现用Resnet提取特征并保存为txt文件的方法
2019/08/20 Python
Python telnet登陆功能实现代码
2020/04/16 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
2020/09/20 Python
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
环保专业大学生职业规划设计
2014/01/10 职场文书
司机工作自我鉴定
2014/09/19 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
祝寿主持词
2015/07/02 职场文书
关于社会实践的心得体会(2016最新版)
2016/01/25 职场文书
Opencv实现二维直方图的计算及绘制
2021/07/21 Python
Golang流模式之grpc的四种数据流
2022/04/13 Golang
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS