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 ui(接口)介绍
Sep 17 Javascript
jQuery页面图片伴随滚动条逐渐显示的小例子
Mar 21 Javascript
JavaScript中判断整字类型最简洁的实现方法
Nov 08 Javascript
jquery实现的美女拼图游戏实例
May 04 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
Aug 17 Javascript
javascript实现全角转半角的方法
Jan 23 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
May 23 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
Mar 24 jQuery
webpack 2.x配置reactjs基本开发环境详解
Aug 08 Javascript
实现图片首尾平滑轮播(JS原生方法—节流)
Oct 17 Javascript
微信小程序修改checkbox的样式代码实例
Jan 21 Javascript
JS精髓原型链继承及构造函数继承问题纠正
Jun 16 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
PHP5.4中json_encode中文转码的变化小结
2013/01/30 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
js不完美解决click和dblclick事件冲突问题
2012/07/16 Javascript
js使用栈来实现10进制转8进制与取除数及余数
2014/06/11 Javascript
从数据库读取数据后将其输出成html标签的三种方法
2014/10/13 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
vue实现扫码功能
2020/01/17 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
jQuery实现图片切换效果
2020/10/19 jQuery
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
Pytorch的mean和std调查实例
2020/01/02 Python
Python datetime 格式化 明天,昨天实例
2020/03/02 Python
手把手教你安装Windows版本的Tensorflow
2020/03/26 Python
keras 权重保存和权重载入方式
2020/05/21 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
2021/01/24 Python
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
关键字throw与throws的用法差异
2016/11/22 面试题
政法大学毕业生自荐信范文
2014/01/01 职场文书
学生打架检讨书大全
2014/01/23 职场文书
2015年质量管理工作总结范文
2015/05/18 职场文书
思品教学工作总结
2015/08/10 职场文书
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏