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——表单应用范例
Feb 20 Javascript
从父页面读取和操作iframe中内容方法
Jul 25 Javascript
JavaScript中Function详解
Feb 27 Javascript
jQuery侧边栏实现代码
May 06 Javascript
canvas绘制多边形
Feb 24 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
Jul 20 Javascript
jquery中done和then的区别(详解)
Dec 19 jQuery
vue 标签属性数据绑定和拼接的实现方法
May 17 Javascript
Vue.js实现的表格增加删除demo示例
May 22 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
Jul 10 Javascript
node.js遍历目录的方法示例
Aug 01 Javascript
浅谈Node框架接入ELK实践总结
Feb 22 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文件上传类分享
2014/11/18 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
jquery $("#variable") 循环改变variable的值示例
2014/02/23 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
Python用GET方法上传文件
2015/03/10 Python
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
详解Python中open()函数指定文件打开方式的用法
2016/06/04 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
Python实现基于POS算法的区块链
2018/08/07 Python
python利用thrift服务读取hbase数据的方法
2018/12/27 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
python hashlib加密实现代码
2019/10/17 Python
Python 识别12306图片验证码物品的实现示例
2020/01/20 Python
简述Html5 IphoneX 适配方法
2018/02/08 HTML / CSS
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
中文师范生自荐信
2014/01/30 职场文书
英语国培研修感言
2014/02/13 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
领导干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
乡镇三严三实学习心得体会
2014/10/13 职场文书
个人股份合作协议书
2014/10/24 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
Python中else的三种使用场景
2021/06/16 Python
「天才王子的赤字国家重生术」妮妮姆·拉雷粘土人开订
2022/03/21 日漫
Pillow图像处理库安装及使用
2022/04/12 Python
台积电称即便经济低迷也没有降价的计划
2022/04/21 数码科技
Redis入门基础常用操作命令整理
2022/06/01 Redis