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和HTML5利用canvas构建Web五子棋游戏实现算法
Jul 17 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
Jul 02 Javascript
JavaScript设计模式之代理模式介绍
Dec 28 Javascript
ajax在兼容模式下失效的快速解决方法
Mar 22 Javascript
微信小程序 网络API Websocket详解
Nov 09 Javascript
vue开发调试神器vue-devtools使用详解
Jul 13 Javascript
React-Native 组件之 Modal的使用详解
Aug 08 Javascript
vue-cli项目配置多环境的详细操作过程
Oct 30 Javascript
微信小程序实现订单倒计时
Nov 01 Javascript
微信小程序实现form表单本地储存数据
Jun 27 Javascript
vue keep-alive的简单总结
Jan 25 Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
Apr 24 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 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
php实现的日历程序
2015/06/18 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
永不消失的title提示代码
2007/02/15 Javascript
jQuery插件-jRating评分插件源码分析及使用方法
2012/12/28 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
Javascript网页抢红包外挂实现分享
2018/01/11 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
2018/03/24 Javascript
jQuery实现表单动态添加与删除数据操作示例
2018/07/03 jQuery
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
python 正则表达式 概述及常用字符
2009/05/04 Python
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
一文解决django 2.2与mysql兼容性问题
2020/07/15 Python
Python接收手机短信的代码整理
2020/08/02 Python
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
母亲追悼会答谢词
2014/01/27 职场文书
五年级英语教学反思
2014/01/31 职场文书
网络编辑职责
2014/03/01 职场文书
幼儿园三八妇女节活动方案
2014/03/11 职场文书
小学三八妇女节活动方案
2014/03/16 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
校园环境卫生倡议书
2015/04/29 职场文书
2015年宣传思想工作总结
2015/05/22 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
68句权威创业名言
2019/08/26 职场文书