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获取DOM元素位置和尺寸大小的方法
Apr 12 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
Jan 19 Javascript
45个JavaScript编程注意事项、技巧大全
Feb 11 Javascript
Node.js如何自动审核团队的代码
Jul 20 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Dec 14 Javascript
Js经典案例的实例代码
May 10 Javascript
详解关于element级联选择器数据回显问题
Feb 20 Javascript
js绘制一条直线并旋转45度
Aug 21 Javascript
.netcore+vue 实现压缩文件下载功能
Sep 24 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
Nov 19 Vue.js
JavaScript 实现页面滚动动画
Apr 24 Javascript
Vue.Draggable实现交换位置
Apr 07 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和数据库结合的一个简单的web实例 代码分析 (php初学者)
2011/07/28 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
JavaScript中的Window窗口对象
2008/01/16 Javascript
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
JS正则替换掉小括号及内容的方法
2016/11/29 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
js学习总结之DOM2兼容处理this问题的解决方法
2017/07/27 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
js+css实现扇形导航效果
2020/08/18 Javascript
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
Python中字典和集合学习小结
2017/07/07 Python
Python中enumerate()函数编写更Pythonic的循环
2018/03/06 Python
python模块smtplib学习
2018/05/22 Python
python采集微信公众号文章
2018/12/20 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
python多线程分块读取文件
2019/08/29 Python
Python Map 函数的使用
2020/08/28 Python
详解Anaconda 的安装教程
2020/09/23 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
设计部经理的岗位职责
2013/11/16 职场文书
安全生产目标责任书
2014/04/14 职场文书
英语专业自荐书
2014/06/13 职场文书
项目验收申请报告
2015/05/15 职场文书
银行柜员工作心得体会
2016/01/23 职场文书
2019大学生实习报告
2019/06/21 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
Python中json.dumps()函数的使用解析
2021/05/17 Python