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 相关文章推荐
javascript编程起步(第四课)
Jan 10 Javascript
JavaScript在IE中“意外地调用了方法或属性访问”
Nov 19 Javascript
基于jquery+thickbox仿校内登录注册框
Jun 07 Javascript
Javascript开发之三数组对象实例介绍
Nov 12 Javascript
用js判断页面是否加载完成实现代码
Dec 11 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
Dec 04 Javascript
javascript 闭包详解及简单实例应用
Dec 31 Javascript
JavaScript中in和hasOwnProperty区别详解
Aug 04 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
Sep 06 jQuery
js的继承方法小结(prototype、call、apply)(推荐)
Apr 17 Javascript
VUE实现密码验证与提示功能
Oct 18 Javascript
小程序自定义弹框效果
Nov 16 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 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
PHP实现获取图片颜色值的方法
2014/07/11 PHP
PHP多线程编程之管道通信实例分析
2015/03/07 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
PHP面向对象中new self()与 new static()的区别浅析
2017/08/17 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
2018/04/20 PHP
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
jquery购物车实时结算特效实现思路
2013/09/23 Javascript
Javascript排序算法之计数排序的实例
2014/04/05 Javascript
jQuery仿gmail实现fixed布局的方法
2015/05/27 Javascript
js定义类的几种方法(推荐)
2016/06/08 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
2016/11/01 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
详解AngularJS 模块化
2017/06/14 Javascript
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
vue实现pdf导出解决生成canvas模糊等问题(推荐)
2018/10/18 Javascript
JavaScript中concat复制数组方法浅析
2019/01/20 Javascript
利用原生JavaScript实现造日历轮子实例代码
2019/05/08 Javascript
javascript中的this作用域详解
2019/07/15 Javascript
[02:19]2014DOTA2国际邀请赛 专访820少年们一起去追梦吧
2014/07/14 DOTA
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
tensorflow之变量初始化(tf.Variable)使用详解
2020/02/06 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
深入了解Python装饰器的高级用法
2020/08/13 Python
全球立体声:World Wide Stereo
2018/09/29 全球购物
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
法律专业学生的自我评价
2014/02/07 职场文书
责任担保书范文
2014/05/21 职场文书
水电维修专业推荐信
2014/09/06 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang
react如何快速设置文件路径别名
2021/04/28 Javascript
手把手教你怎么用Python实现zip文件密码的破解
2021/05/27 Python