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中的排序算法代码
Feb 22 Javascript
jquery删除数据记录时的弹出提示效果
May 06 Javascript
JavaScript获取页面中第一个锚定文本的方法
Apr 03 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
Aug 27 Javascript
JavaScript基本的输出和嵌入式写法教程
Oct 20 Javascript
AngularJS实现分页显示数据库信息
Jul 01 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
Jul 26 Javascript
详解JS中的柯里化(currying)
Aug 17 Javascript
js编写简单的聊天室功能
Aug 17 Javascript
JS基于Location实现访问Url、重定向及刷新页面的方法分析
Dec 03 Javascript
js刷新页面location.reload()用法详解
Dec 09 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
Jan 07 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 EOT定界符的使用详解
2008/09/30 PHP
php中通过curl smtp发送邮件
2012/06/05 PHP
简单谈谈favicon
2015/06/10 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
2016/02/04 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
JXTree对象,读取外部xml文件数据,生成树的函数
2007/04/02 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
js动态创建表格,删除行列的小例子
2013/07/20 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
vscode下的vue文件格式化问题
2018/11/28 Javascript
浅谈Node新版本13.2.0正式支持ES Modules特性
2019/11/25 Javascript
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
pygame学习笔记(5):游戏精灵
2015/04/15 Python
python中迭代器(iterator)用法实例分析
2015/04/29 Python
python扫描proxy并获取可用代理ip的实例
2017/08/07 Python
python递归实现快速排序
2018/08/18 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
俄罗斯街头服装品牌:Black Star Wear
2017/03/01 全球购物
捷克汽车配件和工具销售网站:TorriaCars
2018/02/26 全球购物
Why do we need Unit test
2013/01/03 面试题
大学生职业生涯规划书前言
2014/01/09 职场文书
检举信的格式及范文
2014/04/04 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
关于责任的演讲稿
2014/05/20 职场文书
销售经理岗位职责
2015/01/31 职场文书
三八妇女节慰问信
2015/02/14 职场文书
Java移除无效括号的方法实现
2021/08/07 Java/Android