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 相关文章推荐
prototype 源码中文说明之 prototype.js
Sep 22 Javascript
jquery uaMatch源代码
Feb 14 Javascript
jQuery中andSelf()方法用法实例
Jan 08 Javascript
JSON与XML优缺点对比分析
Jul 17 Javascript
JavaScript代码实现左右上下自动晃动自动移动
Apr 08 Javascript
浅谈Javascript数组(推荐)
May 17 Javascript
Bootstrap轮播插件简单使用方法介绍
Jun 21 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
Jul 28 Javascript
vue中动态绑定表单元素的属性方法
Feb 23 Javascript
11行JS代码制作二维码生成功能
Mar 09 Javascript
移动端图片上传旋转、压缩问题的方法
Oct 16 Javascript
JavaScript中如何调用Java方法
Sep 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利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
简单JS代码压缩器
2006/10/12 Javascript
javascript中的prototype属性使用说明(函数功能扩展)
2010/08/16 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
js有序数组的连接问题
2013/10/01 Javascript
jquery实现input输入框实时输入触发事件代码
2014/01/28 Javascript
JS中去掉array中重复元素的方法
2017/05/26 Javascript
简述vue路由打开一个新的窗口的方法
2018/11/29 Javascript
vue中v-text / v-html使用实例代码详解
2019/04/02 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
Python错误处理操作示例
2018/07/18 Python
python实现京东秒杀功能
2018/07/30 Python
python 异或加密字符串的实例
2018/10/14 Python
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
python绘图模块matplotlib示例详解
2019/07/26 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
使用Matplotlib 绘制精美的数学图形例子
2019/12/13 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
如何写出高性能的JSP和Servlet
2013/01/22 面试题
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
中专三年学习的个人自我评价
2013/12/12 职场文书
小学生节约用水倡议书
2014/05/15 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
2014年保密工作总结
2014/11/22 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers