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 相关文章推荐
菜单效果
Oct 14 Javascript
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
Jan 22 Javascript
IE6下opacity与JQuery的奇妙结合
Mar 01 Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
Mar 19 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
Jul 17 Javascript
js实现星星打分效果的方法
Jul 05 Javascript
浅析angularJS中的ui-router和ng-grid模块
May 20 Javascript
JS数组操作之增删改查的简单实现
Aug 21 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
Dec 05 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
Feb 10 Javascript
VUE安装使用教程详解
Jun 03 Javascript
vue中data改变后让视图同步更新的方法
Mar 29 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
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
2014/06/25 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
js函数调用常用方法详解
2012/12/03 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
2014/05/08 Javascript
jQuery异步加载数据并添加事件示例
2014/08/24 Javascript
jQuery+css实现百度百科的页面导航效果
2014/12/16 Javascript
javascript中数组的定义及使用实例
2015/01/21 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
判断输入的字符串是否是日期格式的简单方法
2016/07/11 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
javascript实现文字无缝滚动
2016/12/27 Javascript
基于jQuery实现数字滚动效果
2017/01/16 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
js图片上传的封装代码
2017/08/01 Javascript
vue+vuecli+webpack中使用mockjs模拟后端数据的示例
2017/10/24 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
Vue Promise的axios请求封装详解
2018/08/13 Javascript
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
Python字符串详细介绍
2015/05/09 Python
Python pymongo模块用法示例
2018/03/31 Python
编写类String的构造函数、析构函数和赋值函数
2012/05/29 面试题
kfc实习自我鉴定
2013/12/14 职场文书
客服服务心得体会
2013/12/30 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
2022/05/30 NodeJs