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 相关文章推荐
js预加载图片方法汇总
Jun 15 Javascript
jquery实现页面常用的返回顶部效果
Mar 04 Javascript
jQuery日程管理插件fullcalendar使用详解
Jan 07 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
Jan 23 Javascript
[js高手之路]单例模式实现模态框的示例
Sep 01 Javascript
vue实现页面加载动画效果
Sep 19 Javascript
jQuery EasyUI 选项卡面板tabs的使用实例讲解
Dec 25 jQuery
vue-cli配置文件——config篇
Jan 04 Javascript
JS运动改变单物体透明度的方法分析
Jan 23 Javascript
基于bootstrap页面渲染的问题解决方法
Aug 09 Javascript
微信小程序开发之左右分栏效果的实例代码
May 20 Javascript
vue指令v-html使用过滤器filters功能实例
Oct 25 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
使用Apache的rewrite技术
2006/06/22 PHP
PHP文本数据库的搜索方法
2006/10/09 PHP
简单了解WordPress开发中update_option()函数的用法
2016/01/11 PHP
CodeIgniter控制器之业务逻辑实例分析
2016/01/20 PHP
php编程每天必学之表单验证
2016/03/01 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
Jquery动态进行图片缩略的原理及实现
2013/08/13 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
2015/10/20 Javascript
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
jquery 动态合并单元格的实现方法
2016/08/26 Javascript
微信小程序 刷新上拉下拉不会断详细介绍
2017/05/11 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
python实现ip查询示例
2014/03/26 Python
Python之PyUnit单元测试实例
2014/10/11 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
python实现俄罗斯方块游戏
2020/03/25 Python
Python中的四种交换数值的方法解析
2019/11/18 Python
Python GUI库PyQt5样式QSS子控件介绍
2020/02/25 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
C++的几个面试题附答案
2016/08/03 面试题
施工员岗位职责
2014/03/16 职场文书
班风口号
2014/06/18 职场文书
单位政审意见范文
2015/06/04 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书