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 相关文章推荐
CheckBox 如何实现全选?
Jun 23 Javascript
用倒置滤镜把div倒置,再把table倒置。
Jul 31 Javascript
jQuery页面刷新(局部、全部)问题分析
Jan 09 Javascript
基于Javascript实现返回顶部按钮
Feb 29 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
May 04 Javascript
AngularJS 过滤器的简单实例
Jul 27 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
Aug 15 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
Sep 13 Javascript
Vue请求JSON Server服务器数据的实现方法
Nov 02 Javascript
ES7之Async/await的使用详解
Mar 28 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
Apr 13 Javascript
为react组件库添加typescript类型提示的方法
Jun 15 Javascript
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 输出简单动态WAP页面
2009/06/09 PHP
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
PHP Filter过滤器全面解析
2016/08/09 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
DIV菜单层实现代码
2010/11/19 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
jQuery 阴影插件代码分享
2012/01/09 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
动态添加删除表格行的js实现代码
2014/02/28 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
vue实现文件上传读取及下载功能
2020/11/17 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
Node.js API详解之 module模块用法实例分析
2020/05/13 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
小程序实现点击tab切换左右滑动
2020/11/16 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
python的turtle库使用详解
2019/05/10 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
简单了解python中的与或非运算
2019/09/18 Python
Html5插件教程之添加浏览器放大镜效果的商品橱窗
2016/01/07 HTML / CSS
化工工艺设计求职信
2014/06/25 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
同学聚会通知短信
2015/04/20 职场文书
电工实训心得体会
2016/01/14 职场文书
《比的意义》教学反思
2016/02/18 职场文书
2017新年晚会开幕词
2016/03/03 职场文书