js文件同步加载的缺点:

页面的js文件一般是同步加载,加载到js文件会阻断html和css的加载,要等到js文件加载完毕,才能继续向下执行,因为js文件可能会操作html和css;但有些js文件不会操作html和css,只是进行初始化数据或者引入工具包,我们希望这些js文件能够并行异步加载,以免一个js文件加载失败,导致后续所有页面都加载不了,影响页面效率。

另外有些工具方法需要按需加载(需要再加载,不用不加载)

js异步加载的三种方案:

1.defer 只有IE9以下能用
异步加载,但要等到dom文档全部解析完(dom树已生成)才会被执行,执行时不会阻塞页面

引入外部js文件

<script type = 'text/javascript' src = 'tools.js' defer = 'defer'> </script>

<script type = 'text/javascript' src = 'tools.js' defer > </script>

也可以将代码写到内部

<script type = 'text/javascript' defer>var a = 123; //写在内部
</script>

2.async W3C标准方法
异步加载,加载完就执行,执行时不会阻塞页面,async只能加载外部js,不能把js写在script标签里

<script type = 'text/javascript' src = 'tool.js' async = 'async'></script>

<script type = 'text/javascript' src = 'tool.js' async ></script>

以上两种方法不能很好的处理浏览器兼容问题,因此可以使用第三种方法,更加强大,既可异步加载,也可按需加载

3.创建script节点,插入到DOM中,加载完毕后callBack

var script  = document.createElement('script') //创建
script.type = 'text/javascript' //设置
script.src = 'index.js' //这句执行完 系统就会异步下载指定的文件
...//其他的操作
document.head.appendChild(script) //script标签插入文档后 系统才会解析这个脚本 否则只是下载

但由于系统是异步下载js文件,很可能script标签插入文档的时候,甚至调用js文件中方法的时候,js文件还没有下载完成

var script  = document.createElement('script')
script.type = 'text/javascript'
script.src = 'index.js' //这句执行完 系统就会异步下载指定的文件
document.head.appendChild(script) //script插入文档后 才会解析这个脚本 否则只是下载
test() //系统执行这段语句的时候 js文件可能还未加载完 故会报错


可以设置定时器,在规定时间后(给js文件下载时间)再执行函数

var script  = document.createElement('script')
script.type = 'text/javascript'
script.src = 'index.js' //这句执行完 系统就会异步下载指定的文件
document.head.appendChild(script) //script插入文档后 才会解析这个脚本 否则只是下载
// test()
setTimeout(function(){ //设置定时器 在规定时间后再执行函数test() //这个时候js文件已经下载完成 可以执行
},1000)


但我们并不清楚要等待多久js文件才会下载完成,那么有没有一个机制能够提醒我们呢?

可使用load事件(并不是只有window才有load事件,但凡需要下载的就有load事件,比如script

var script  = document.createElement('script')
script.type = 'text/javascript'
script.src = 'index.js' //这句执行完 系统就会异步下载指定的文件
script.onload = function(){ //script加载(即js文件下载完)完毕才执行函数test()
}
document.head.appendChild(script) //script插入文档后 才会解析这个脚本 否则只是下载

script.onload的能够兼容safari、chrome、firefox、opera,只有IE不兼容,IE没有load事件

但IE有一套自己的方法,IE的script上有一个属性为状态码readyState,默认值是loading,会根据script的加载进度动态地改变属性值,script加载完毕时状态码的值为completeloaded

IE也提供了一套监听机制用于监听script的状态码的变化

script.onreadystatechange = function(){ //监听script的状态码的变化if(script.readyState == 'complete' || 'loaded'){ //script加载完毕// 逻辑}
}

能够解决浏览器兼容问题的js文件加载完成立即执行函数逻辑的工具方法

function loadScript(url,callback){ //callback回调函数可以是函数、字符串、数组等var script = document.createElement('script')script.type = 'text/javascript'if(script.readyState){//IEscript.onreadystatechange = function(){ //监听script的状态码的变化if(script.readyState == 'complete' || 'loaded'){callback()//eval(callback) 当callback为字符串(情况1)时,eval可将其当作函数来调用//obj[callback]() 当callback为字符串(情况2)且所要调用的函数在js文件中是以对象属性的形式存在时}}}else{ //safari、chrome、firefox、operascript.onload = function(){callback()//eval(callback)//obj[callback]()}}script.src = url //js文件的下载最好放在绑定监听事件之后,以免状态码在绑定监听事件之前已完成变化就不会被监听到document.head.appendChild(script)
}
// loadScript('index.js',test)
//会报错 test is not defined 因为在传入test的时候,js文件还在函数中未被加载
loadScript('index.js',function(){ //可传入匿名函数 传入时函数内部逻辑不会被解析test()
})
或
loadScript('index.js','test()') //传入字符串形式(情况1)
或
loadScript('index.js','test') //传入字符串形式(情况2)

JS 异步加载js的三种方案相关推荐

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

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

  2. 实现JS异步加载的三种方法

    一.为什么要写异步加载: ①js加载本身是属于同步加载的,加载js文件会阻塞文档,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作.但是有些工具方法需要按需加载,有一些工具js文件它是不 ...

  3. 【前端】JS异步加载

    文章目录 为什么要异步加载 如何实现异步加载 参考 为什么要异步加载 两个原因其实是一个意思. 原因1: JS是单线程的语言,它会同步的执行代码,从上往下执行 但是,一旦网络不好,或要加载的js文件过 ...

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

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

  5. angularjs 路由 异步加载js

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

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

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

  7. 14. 异步加载Js的方式有哪些?

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

  8. js延迟加载、js异步加载

    1.js延迟加载     (1)js延迟加载是js性能优化的一种方式     (2)作用:为了提高网页的加载速度     (3)原理:等网页加载完成之后再加载js文件         ··需要优化的原 ...

  9. 知识点讲解五:处理js异步加载问题

    文章目录 前言 环境 代码思路 原代码 前言 在新闻网站中大多采用的是异步加载模式,新闻条目会随滚动条的滚动而逐渐加载.当爬虫访问这类网站时得到的HTML数据仅仅是我们看到的页面数据,只有当我们向下滚 ...

最新文章

  1. 青源 LIVE 第 20 期 | 复旦大学吴祖煊:高效视频内容识别
  2. LeetCode: 66. Plus One
  3. [C++再学习系列] 前置++与后置++
  4. java 使用jar_Java 使用JAR文件
  5. c#中使用多线程访问winform中控件的若干问题
  6. CMMI与Agile敏捷开发比较之一:两者的本质区别
  7. Spring boot admin 使用
  8. Postgre SQL学习
  9. 数据库高级查询与性能优化1,开窗函数与子查询
  10. 卸载网易邮箱大师邮件从服务器删除,如何卸载网易邮箱大师 网易邮箱大师卸载教程...
  11. linux开机启动grub rescue,Ubuntu 开机出现 grub rescue 的模式下修复
  12. Css Reset -Css样式重置
  13. 下载优酷视频 基于python2
  14. FPGA串口多字节接收、解码和仿真
  15. SQLite 表达式索引的概念和作用
  16. Win10怎么设置默认输入法为美式英文键盘
  17. FLASH多文件上传组件
  18. 模拟登陆CSDN——就是这么简单
  19. python设计模式 韦塞尔 pdf下载_《Python设计模式》 [美] 韦塞尔. 巴登霍斯特(Wessel Badenhorst)著 蒲成 译 【正版电子纸书阅读_PDF下载】- 书问...
  20. 国内最专业的化妆品网站--宝迪网

热门文章

  1. java 格式化输出 对齐_Java中中英文对齐输出问题,以及Java中的格式化输出
  2. 判断是否为整数 整数判断
  3. Oracle集合查询详解加练习题
  4. 为什么老实人总是节节败退(关于婚姻)
  5. 【JS案例】:实现盒子拖拽功能
  6. 如何用C语言写一个服务器和客户端(TCP)
  7. 2017年我国将开始部署和建设IPv6地址项目
  8. 利用docker部署深度学习模型的一个最佳实践
  9. 电脑故障排除之先八后八
  10. Unity 工具控件 之 Text 文本字间距调整(老版本的Unity编写工具控件/新版本Unity使用TMP)