JS异步加载的三种实现方式


Posted in Javascript onMarch 16, 2017

js加载的缺点:加载工具方法没必要阻塞文档,过多js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作。 有些工具方法需要按需加载,用到再加载,不用不加载,。

默认正常模式下下,JS是同步加载的,即优先加载JS,只有当JS文件下载完,dom和css才开始加载,当某些时候我们需要JS异步加载,我们可以通过以下方式来设置异步加载,不同情况下选取不同方式即可

1.defer:defer

  1. JS异步下载,dom结构解析完(标签 + 样式(内容不一定下载完))才异步执行 
  2. 仅IE能用
  3. 内部JS也能用该属性
  4. 异步加载js不允许使用document.write,因为document.write会清除文档流,js标签还未加载就会被清除
  5. document.write()可用于初始化页面

2.(h5)async:async(asynchronous) ajax(asynchronous javascript and XML)

  1. JS异步加载,加载完毕后立刻异步执行
  2. IE8及以下不兼容
  3. 内部JS不能用该属性

3.除了以上两种方法,还有一种兼容自己封装的异步加载方式,即动态添加script标签也能实现异步加载。

function asyncLoaded(url,callBack){/*url为js的链接,callBack为url的js中的函数(该函数调用应该写到匿名函数中,如function(){console.log(div.getScrollOffset())})*/
  var script = document.createElement('script');
  script.type = 'text/javascript';
  /*if else 这几句话必须要写到这位置处,不能放最后,因为if中js加载中script.readyState存在好几种状态,
  只有状态改变‘readystatechange'事件才会触发,但现在浏览器加载速度很快,当解析到该事件时JS有可能已经加载完,
  所以事件根本不会触发,所以要写到前面*/
  if(script.readystate){//兼容IE
    script.onreadystatechange = function() {//状态改变事件才触发
      if(script.readyState == 'loaded' || script.readyState == 'complete'){  
        callBack();
        script.onreadystatechange = null;    
      }
    }
  }else{
    script.onload = function(e){
      callBack();
    }
  }    
  script.src = url;
  document.body.appendChild(script);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
addRule在firefox下的兼容写法
Nov 30 Javascript
javascript实现上传图片前的预览(TX的面试题)
Aug 20 Javascript
浅谈JavaScript函数参数的可修改性问题
Dec 05 Javascript
jQuery实现div浮动层跟随页面滚动效果
Feb 11 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
May 04 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
Dec 18 Javascript
dul无法加载bootstrap实现unload table/user恢复
Sep 29 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
Jan 04 Javascript
JS中的数组转变成JSON格式字符串的方法
May 09 Javascript
jquery css实现流程进度条
Mar 26 jQuery
Element-UI 使用el-row 分栏布局的教程
Oct 26 Javascript
Vue+penlayers实现多边形绘制及展示
Dec 24 Vue.js
Bootstrap免费字体和图标网站(值得收藏)
Mar 16 #Javascript
基于JavaScript实现滑动门效果
Mar 16 #Javascript
基于Vue2.0的分页组件
Mar 16 #Javascript
原生js实现验证码功能
Mar 16 #Javascript
基于vue实现多引擎搜索及关键字提示
Mar 16 #Javascript
vue图片加载与显示默认图片实例代码
Mar 16 #Javascript
js中作用域的实例解析
Mar 16 #Javascript
You might like
php fsockopen解决办法 php实现多线程
2014/01/20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
2015/12/22 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
巧妙破除网页右键禁用的十大绝招
2006/08/12 Javascript
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
javascript 弹出层组件(升级版)
2011/05/12 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
Angularjs处理页面闪烁的解决方法
2017/03/09 Javascript
聊聊Vue.js的template编译的问题
2017/10/09 Javascript
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
编写Python脚本来实现最简单的FTP下载的教程
2015/05/04 Python
机器学习python实战之决策树
2017/11/01 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
2018/06/22 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
2018/10/29 Python
python logging 日志的级别调整方式
2020/02/21 Python
K最近邻算法(KNN)---sklearn+python实现方式
2020/02/24 Python
对python中return与yield的区别详解
2020/03/12 Python
Python如何解除一个装饰器
2020/08/07 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
美国牛仔品牌:True Religion
2018/11/16 全球购物
公司清洁工岗位职责
2013/12/14 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python
Python学习之迭代器详解
2022/04/01 Python
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python