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 相关文章推荐
一实用的实现table排序的Javascript类库
Sep 12 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
Mar 01 Javascript
通过Javascript创建一个选择文件的对话框代码
Jun 16 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
Jan 11 Javascript
Javascript中的getUTCHours()方法使用详解
Jun 10 Javascript
javascript实现保留两位小数的多种方法
Dec 18 Javascript
JavaScript中iframe实现局部刷新的几种方法汇总
Jan 06 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
Sep 23 Javascript
通过webpack引入第三方库的方法
Jul 20 Javascript
vue下拉菜单组件(含搜索)的实现代码
Nov 25 Javascript
微信小程序页面间值传递的两种方法
Nov 26 Javascript
详解vue 路由跳转四种方式 (带参数)
Apr 28 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
关于IIS php调用com组件的权限问题
2012/01/11 PHP
基于php split()函数的用法详解
2013/06/05 PHP
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
PHP连接局域网MYSQL数据库的简单实例
2013/08/26 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
2014/12/24 PHP
PHP数据分析引擎计算余弦相似度算法示例
2017/08/08 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
JavaScript中的null和undefined区别介绍
2015/01/01 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
2016/09/13 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
详解微信小程序开发之城市选择器 城市切换
2017/01/17 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
vue+axios 前端实现的常用拦截的代码示例
2018/08/23 Javascript
详解基于electron制作一个node压缩图片的桌面应用
2019/01/29 Javascript
微信小程序实现授权登录
2019/05/15 Javascript
python client使用http post 到server端的代码
2013/02/10 Python
使用python绘制人人网好友关系图示例
2014/04/01 Python
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
Python将图片批量从png格式转换至WebP格式
2020/08/22 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
Python实现登陆文件验证方法
2018/10/06 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
咖啡馆创业计划书
2014/01/26 职场文书
2014年网管工作总结
2014/12/11 职场文书
2015年师德师风自我评价范文
2015/03/05 职场文书
综合素质评价个性与发展自我评价
2015/03/06 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript