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的25个步骤 千倍级效率提升
Feb 11 Javascript
jquery可定制的在线UEditor编辑器
Nov 17 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
Jan 23 Javascript
JS中作用域和变量提升(hoisting)的深入理解
Oct 31 Javascript
bootstrap css样式之表单
Jan 19 Javascript
浅谈Vuejs Prop基本用法
Aug 17 Javascript
不得不知的ES6小技巧
Jul 28 Javascript
微信小程序实现工作时间段选择
Feb 15 Javascript
React Hooks 实现和由来以及解决的问题详解
Jan 17 Javascript
vue结合el-upload实现腾讯云视频上传功能
Jul 01 Javascript
Node实现搜索框进行模糊查询
Jun 28 Javascript
Vue如何清空对象
Mar 03 Vue.js
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
基于文本的访客签到簿
2006/10/09 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
基于JQuery的动态删除Table表格的行和列的代码
2011/05/12 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
基于jquery异步传输json数据格式实例代码
2013/11/23 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
针对JavaScript中this指向的简单理解
2016/08/26 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
2016/09/24 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
浅谈vue 单文件探索
2018/09/05 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
python基础教程之面向对象的一些概念
2014/08/29 Python
Python字符串和文件操作常用函数分析
2015/04/08 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
基于python 爬虫爬到含空格的url的处理方法
2018/05/11 Python
详解Python3.6安装psutil模块和功能简介
2018/05/30 Python
详解python运行三种方式
2019/05/13 Python
pandas的相关系数与协方差实例
2019/12/27 Python
pytorch::Dataloader中的迭代器和生成器应用详解
2020/01/03 Python
Python阶乘求和的代码详解
2020/02/14 Python
Python3如何判断三角形的类型
2020/04/12 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
大二自我鉴定
2014/01/31 职场文书
财务部副经理岗位职责范本
2014/06/17 职场文书
2014幼儿教师个人工作总结
2014/12/03 职场文书
优秀小学生事迹材料
2014/12/26 职场文书