javascript按顺序加载运行js方法


Posted in Javascript onDecember 01, 2017

首先如果大家对JS动态加载有不理解的地方可以参阅:

如何你的 script 上没有任何 异步,阻塞 等标注:

浏览器会异步加载 javascript 文件,但是会按照引用文件中的书写顺序从上到下执行解析 javascript

Defer属性标记

defer是html4.0中定义的,该属性使得浏览器能延迟脚本的执行,等文档完成解析完成后会按照他们在文档出现顺序再去下载解析。

也就是说defer属性的 script 就类似于将 script 放在body中的加载 效果一致.

但是defer属性在各个浏览器中支持程度有点不同,就是说,有的浏览器不完全支持.

Async属性标注

async是HTML5新增的属性, 大部分先进支持该属性的.
该属性的作用是让脚本能异步加载,也就是说当浏览器遇到async属性的 script 时浏览器加载css一样是异步加载的

javascript 动态加载js文件

原理很简单,创建一个 script 节点,给节点赋予 script 的属性,然后 append 到 dom 的 head 标签中.

function loadJS(url){
  var Script = document.createElement('script');
  Script.setAttribute('src', url);
  Script.setAttribute('type', 'text/javascript');
  document.body.appendChild(Script);
  return Script;
}

如果我们同时加载多个 javascript 文件

loadJS('a.js');
loadJS('b.js');

上面的效果是,a.js 和 b.js 文件会被异步同时加载,如果 b.js 文件比 a.js 文件小的话,很可能先加载执行 b.js ,完全不会按照书写结果加载执行

所以,如果你的 b.js 文件有依赖 a.js 的东西,那么就会报错,因为解释执行b.js 的时候,a.js 还在加载中.

控制javascript 加载执行顺序

我们对代码做如下改进

function loadJS(url, success) {
      var domScript = document.createElement('script');
      domScript.src = url;
      success = success || function () {
          };
      domScript.onload = domScript.onreadystatechange = function () {
        if (!this.readyState || 'loaded' === this.readyState || 'complete' === this.readyState) {
          success();
          this.onload = this.onreadystatechange = null;
          this.parentNode.removeChild(this);
        }
      }
      document.getElementsByTagName('head')[0].appendChild(domScript);
    }

通过script 节点上的 onload 和 onreadystatechange 属性来监听节点 src 是否加载完成

如果成功,调用回调函数 success();

我们在调用此方法的时候,可以通过 loadJS 回调函数来知道当前节点已经加载完成,然后在回调函数里继续加载其他 script 文件

loadJS(getUrl('a.js'), function () {
      loadJS(getUrl('b.js'), function () {
        console.log('a.js ,b.js 加载完成');
      });
});

通过上面的方法加载,是一种同步阻塞加载, a.js 加载完成后才会加载执行 b.js 文件.

如果你的 javascript 文件没有相互依赖关系,不要使用这种方法.

Javascript 相关文章推荐
JQuery实现鼠标滑过显示导航下拉列表
Sep 12 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
Nov 26 Javascript
JQuery中extend使用介绍
Mar 13 Javascript
常见的原始JS选择器使用方法总结
Apr 09 Javascript
IE中鼠标经过option触发mouseout的解决方法
Jan 29 Javascript
ECMAScript6函数默认参数
Jun 12 Javascript
基于socket.io+express实现多房间聊天
Mar 17 Javascript
AngularJS的脏检查深入分析
Apr 22 Javascript
angular select 默认值设置方法
Jun 23 Javascript
JS实现自定义状态栏动画文字效果示例
Oct 12 Javascript
详解基于Vue2.0实现的移动端弹窗(Alert, Confirm, Toast)组件
Aug 02 Javascript
JavaScript日期库date-fn.js使用方法解析
Sep 09 Javascript
AngularJS2 与 D3.js集成实现自定义可视化的方法
Dec 01 #Javascript
javascript Function函数理解与实战
Dec 01 #Javascript
React Native react-navigation 导航使用详解
Dec 01 #Javascript
分析JS单线程异步io回调的特性
Dec 01 #Javascript
JavaScript定义及输出螺旋矩阵的方法详解
Dec 01 #Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
Dec 01 #Javascript
利用babel将es6语法转es5的简单示例
Dec 01 #Javascript
You might like
php不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
2017/09/13 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
js动态修改input输入框的type属性(实现方法解析)
2013/11/13 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
jQuery制作仿Mac Lion OS滚动条效果
2015/02/10 Javascript
基于JavaScript的操作系统你听说过吗?
2016/01/28 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
python实现类似ftp传输文件的网络程序示例
2014/04/08 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
python中如何使用分步式进程计算详解
2019/03/22 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
Python实现敏感词过滤的4种方法
2020/09/12 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
德国电子产品购物网站:TechInTheBasket德国
2018/12/07 全球购物
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
法学专业毕业生求职信
2014/06/12 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
Python绘制分类图的方法
2021/04/20 Python
Python预测分词的实现
2021/06/18 Python