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 相关文章推荐
javascript window.confirm确认 取消对话框实现代码小结
Oct 21 Javascript
JS记录用户登录次数实现代码
Jan 15 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
Mar 18 Javascript
JavaScript中textRange对象使用方法小结
Mar 24 Javascript
JavaScript检查数字是否为整数或浮点数的方法
Jun 09 Javascript
js仿支付宝多方框输入支付密码效果
Sep 27 Javascript
Vue的Flux框架之Vuex状态管理器
Jul 30 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
Sep 03 Javascript
vue实现菜单切换功能
May 08 Javascript
JS实现打砖块游戏
Feb 14 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
Jul 29 Javascript
Ant Design moment对象和字符串之间的相互转化教程
Oct 27 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
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
php处理复杂xml数据示例
2016/07/11 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
基于javascript实现tab切换特效
2016/03/29 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
2016/12/20 Javascript
Javascript 制作图形验证码实例详解
2016/12/22 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
2018/06/05 jQuery
React父子组件间的传值的方法
2018/11/13 Javascript
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
简要讲解Python编程中线程的创建与锁的使用
2016/02/28 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
英国足球店:UK Soccer Shop
2017/11/19 全球购物
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
判断单链表中是否存在环
2012/07/16 面试题
盛大笔试题
2016/11/05 面试题
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
护理专业应届毕业生推荐信
2013/11/15 职场文书
学校后勤人员职责
2013/12/27 职场文书
绿色环保标语
2014/06/12 职场文书
社区综治工作汇报
2014/10/27 职场文书
维稳承诺书
2015/01/20 职场文书
协议书范文
2015/01/27 职场文书
协议书格式模板
2016/03/24 职场文书
Redis性能监控的实现
2021/07/09 Redis