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 相关文章推荐
兼容多浏览器的字幕特效Marquee的通用js类
Jul 20 Javascript
javascript OFFICE控件测试代码
Dec 08 Javascript
基于jquery的获取浏览器窗口大小的代码
Mar 28 Javascript
简单的js图片轮换代码(js图片轮播)
May 06 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
Jun 13 Javascript
angular框架实现全选与单选chekbox的自定义
Jul 06 Javascript
js数字滑动时钟的简单实现(示例讲解)
Aug 14 Javascript
javascript将list转换成树状结构的实例
Sep 08 Javascript
vue2.0 实现导航守卫(路由守卫)
May 21 Javascript
vue-cli3使用 DllPlugin 实现预编译提升构建速度
Apr 24 Javascript
解决vue+webpack项目接口跨域出现的问题
Aug 10 Javascript
javascript 数组(list)添加/删除的实现
Dec 17 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
PHP 组件化编程技巧
2009/06/06 PHP
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
PHP企业级应用之常见缓存技术篇
2011/01/27 PHP
PHP采用XML-RPC构造Web Service实例教程
2014/07/16 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
jQuery实现的立体文字渐变效果
2010/05/17 Javascript
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
Js四则运算函数代码
2012/07/21 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
JavaScript调试之console.log调试的一个小技巧分享
2017/08/07 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
js 发布订阅模式的实例讲解
2017/09/10 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
Vue使用mixin分发组件的可复用功能
2019/09/01 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
Python中set与frozenset方法和区别详解
2016/05/23 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
2017/01/12 Python
python八大排序算法速度实例对比
2017/12/06 Python
K-近邻算法的python实现代码分享
2017/12/09 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
python 决策树算法的实现
2020/10/09 Python
使用css3 属性如何丰富图片样式(圆角 阴影 渐变)
2012/11/22 HTML / CSS
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
长曲棍球装备:Lacrosse Monkey
2020/12/02 全球购物
优秀毕业生求职推荐信范文
2013/11/21 职场文书
外语专业毕业生自荐信
2014/04/14 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
会计试用期自我评价
2014/09/19 职场文书
人生一定要学会的三样东西:放下、忘记、珍惜
2019/08/21 职场文书
Python合并多张图片成PDF
2021/06/09 Python