我们都知道渲染引擎遇到 script 标签会停下来,等到执行完脚本,继续向下渲染,如下:
<script type="text/javascript" src="../../libs/public.js" ></script>

这样会阻止浏览器的后续解析,只有当前加载完成才能进行下一步操作,所以默认同步执行才是安全的。但是这样如果JS中有输出document内容、修改dom、重定向的行为,就会造成页面阻塞。所以一般建议把<script>标签放在<body>结尾处,这样尽可能减少页面阻塞。
异步加载又被称为非阻塞加载,浏览器在下载JS的同时,还会进行后续页面处理。那么如何实现js异步加载呢?下面整理了多种实现方案供大家参考:
方法一:Script Dom Element
(function(){var scriptEle = document.createElement("script");scriptEle.type = "text/javasctipt";scriptEle.async = true;scriptEle.src = "http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js";var x = document.getElementsByTagName("head")[0];x.insertBefore(scriptEle, x.firstChild);        })();

  

<async>属性是HTML5中新增的异步支持。此方法被称为Script DOM Element方法
(function(){;var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();

  

但是这种加载方式执行完之前会阻止onload事件的触发,而现在很多页面的代码都在onload时还执行额外的渲染工作,所以还是会阻塞部分页面的初始化处理。
方法二:onload时的异步加载
(function(){if(window.attachEvent){window.attachEvent("load", asyncLoad);}else{window.addEventListener("load", asyncLoad);}var asyncLoad = function(){var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);}
})();

  

这种方法只是把插入script的方法放在一个函数里面,然后放在window的onload方法里面执行,这样就解决了阻塞onload事件触发的问题。
注:DOMContentLoaded与load的区别。前者是在document已经解析完成,页面中的dom元素可用,但是页面中的图片,视频,音频等资源未加载完,作用同jQuery中的ready事件;后者的区别在于页面所有资源全部加载完毕。
方法三:$(document).ready()
需要引入jquery,兼容所有浏览器  
$(document).ready(function() {alert("加载完成!");});

  

方法四:<script>标签的async="async"属性
  • async属性是HTML5新增属性,需要Chrome、FireFox、IE9+浏览器支持
  • async属性规定一旦脚本可用,则会异步执行
  • async属性仅适用于外部脚本
  • 此方法不能保证脚本按顺序执行
  • 他们将在onload事件之前完成
<script type="text/javascript" src="xxx.js" async="async"></script>

  

方法五:<script>标签的defer="defer"属性
  • defer属性规定是否对脚本执行进行延迟,直到页面加载为止
  • 如果脚本不会改变文档的内容,可将defer属性加入到<script>标签中,以便加快处理文档的速度
  • 兼容所有浏览器
  • 此方法可以确保所有设置了defer属性的脚本按顺序执行
<script type="text/javascript" defer></script>

  

方法六:es6模块type="module"属性
浏览器对于带有type=”module”的<script>,都是异步加载,不会造成堵塞浏览器,即等到整个页面渲染完,再执行模块脚本,等同于打开了<script>标签的defer属性 。如下:
<script type="module" src="XXX.js"></script>

  

ES6模块允许内嵌在网页中,语法行为与加载外部脚本一致,如下:
<script type="module"> import utils from "./utils.js"; // other code
</script>

  

转载于:https://www.cnblogs.com/Lolita-web/p/10456967.html

14. 异步加载Js的方式有哪些?相关推荐

  1. 网页性能优化之异步加载js文件

    一个网页的有很多地方可以进行性能优化,比较常见的一种方式就是异步加载js脚本文件.在谈异步加载之前,先来看看浏览器加载js文件的原理. 浏览器加载 JavaScript 脚本,主要通过<scri ...

  2. 异步加载js的三种方法

    js加载时间线 : 它是根据js出生的那一刻开始记录的一系列浏览器按照顺序做的事,形容的就是加载顺序,可以用来优化什么东西,理论基础,背下来. 1.创建Document对象,开始解析web页面.解析H ...

  3. [css] 异步加载CSS的方式有哪些?

    [css] 异步加载CSS的方式有哪些? 异步加载CSS 说到加载 CSS 这种事儿不是很简单吗?像这样咯: 这不就完事儿了嘛! 这样是没错!但是这样有问题啊--会阻塞渲染!浏览器看到这个标签就会停下 ...

  4. 请给出异步加载js方案

    请给出异步加载js方案,不少于两种 默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很 ...

  5. phoneGap异步加载JS失败

    现在正在做一个phoneGap项目,安卓平台,有个异步加载JS总是失败,phoneGap也不好调试,一个问题纠结了一下午 最后找了半天,找到了原因,因此写本文记录一下,也顺便帮帮遇到同样问题的人 原因 ...

  6. 异步加载js文件并执行js方法:实现异步处理网页的复杂效果

    异步加载js文件并执行js方法:实现异步处理网页的复杂效果 有这么一个场景,当你的网页页面效果过多就会造成了打开页面的速度变得缓慢,长时间处于加载的状态,这样的效果通常会让用户感到不友好,通常的处理方 ...

  7. angularjs 路由 异步加载js

    angularjs 异步加载js 有两种方法 第一种  使用$q 和 requireJS 加载 这个问题 首要出现 在 当我 把require 引入 项目中是,希望做到 点击路由时加载相应的页面htm ...

  8. JS异步加载及解决方式

    1.js中的同步加载和异步加载有什么不同? javascript语言是单线程机制.所谓单线程就是按次序执行,执行完一个任务再执行下一个. 对于浏览器来说,也就是无法在渲染页面的同时执行代码. 同步加载 ...

  9. jekyll静态博客提升访问速度:内嵌CSS,异步加载js,压缩HTML

    在谷歌搜索的功能速度(实验性)中推荐使用工具PageSpeed Insights查看我的网页访问速度情况:PageSpeed Insights 分数很低,只有33分. 优化建议的第一条是移除阻塞渲染的 ...

最新文章

  1. 记一次数据中心云平台系统项目实施
  2. 使用Masonry实现UILabel和UIIMageView自适应长度居中
  3. 事务连接中断_漫画——你还记得原生的JDBC怎么连接数据库吗?
  4. 【CMake】Android Studio 中使用 CMake 编译单个 C++ 源文件 ( 常用的 CMake 命令解析 )
  5. sqlserver order by自定义数字排序 其他_苹果cms怎么自定义伪静态规则?
  6. java=====Striing date 转化
  7. apt-get的更新源
  8. codeforces 977A-C语言解题报告
  9. js作用域与作用域链
  10. cname 别名记录 解析过程_西部数码操作解析:如何为服务器创建别名地址
  11. NOIp 2014 #5 解方程 Label:数论?
  12. php goeasy,PHP使用GOEASY实现WEB实时推送
  13. XCTF练习题---MISC---Cephalopod
  14. EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT.
  15. android 4.4 沉浸模式,大杀器:安卓4.4沉浸模式强制开启!
  16. 用户太多:互联网巨头之惑
  17. 五、动态软件体系结构
  18. 云计算技术文章的创作心得
  19. 银行购房按揭贷款利息计算
  20. 工厂如何实现无线wifi短信验证登录?工厂上网实名认证系统

热门文章

  1. Python爬虫入门到实战
  2. 微过滤器驱动开发指南
  3. python 的循环嵌套
  4. springboot根据cron获取任务执行上次和下次执行时间
  5. 【图像处理】相机、透镜、人眼、小孔成像原理
  6. 《嵌入式linux内存使用与性能优化》读书笔记
  7. android汉字转拼音,不用第三方包
  8. c语言编写s11次方,c语言编程练习题.docx
  9. wordpress ajax请求,在wordpress中如何使用ajax
  10. 程序设计的三种基本结构