动态脚本简单示例

// IE下:
var HEAD = document.getElementsByTagName('head')[0] || document.documentElement var src = 'http://xxxxxx.com' var script = document.createElement('script') script.setAttribute('type', 'text/javascript') script.onreadystatechange = function() { if (this.readyState === 'loaded' || this.readyState === 'complete') { console.log('加载成功!') } } script.setAttribute('src', src) HEAD.appendChild(script) // Chrome等现代浏览器:
var HEAD = document.getElementsByTagName('head')[0] || document.documentElement; var src = 'http://xxxxxx.com' var script = document.createElement('script') script.setAttribute('type', 'text/javascript') script.onload = function() { console.log('加载成功!') } script.setAttribute('src', src) HEAD.appendChild(script)

串行和并行动态脚本

/** 

 * 串行加载指定的脚本

 * 串行加载[异步]逐个加载,每个加载完成后加载下一个

 * 全部加载完成后执行回调

 * @param {Array|String} scripts 指定要加载的脚本

 * @param {Function} callback 成功后回调的函数

 * @return {Array} 所有生成的脚本元素对象数组

 */

function seriesLoadScripts(scripts, callback) {

 if(typeof(scripts) !== 'object') {

  var scripts = [scripts];

 }

 var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;

 var s = [];

 var last = scripts.length - 1;

 //递归

 var recursiveLoad = function(i) {

  s[i] = document.createElement('script');

  s[i].setAttribute('type','text/javascript');

  // Attach handlers for all browsers

  // 异步

  s[i].onload = s[i].onreadystatechange = function() {

   if(!/*@cc_on!@*/0 || this.readyState === 'loaded' || this.readyState === 'complete') {

    this.onload = this.onreadystatechange = null; 

    this.parentNode.removeChild(this);

    if(i !== last) {

     recursiveLoad(i + 1);

    } else if (typeof(callback) === 'function') {

     callback()

    };

   }

  }

  // 同步

  s[i].setAttribute('src', scripts[i]);

  HEAD.appendChild(s[i]);

 };

 recursiveLoad(0);

}

/**

 * 并行加载指定的脚本

 * 并行加载[同步]同时加载,不管上个是否加载完成,直接加载全部

 * 全部加载完成后执行回调

 * @param {Array|String} scripts 指定要加载的脚本

 * @param {Function} callback 成功后回调的函数

 * @return {Array} 所有生成的脚本元素对象数组

 */

function parallelLoadScripts(scripts, callback) {

 if(typeof(scripts) !== 'object') {

  var scripts = [scripts];

 }

 var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;

 var s = [];

 var loaded = 0;

 for(var i = 0; i < scripts.length; i++) {

  s[i] = document.createElement('script');

  s[i].setAttribute('type','text/javascript');

  // Attach handlers for all browsers

  // 异步

  s[i].onload = s[i].onreadystatechange = function() {

   if(!/*@cc_on!@*/0 || this.readyState === 'loaded' || this.readyState === 'complete') {

    loaded++;

    this.onload = this.onreadystatechange = null;

    this.parentNode.removeChild(this);

    if(loaded === scripts.length && typeof(callback) === 'function') callback();

   }

  };

  // 同步

  s[i].setAttribute('src',scripts[i]);

  HEAD.appendChild(s[i]);

 }

}

使用方法

var scripts = [ 

 "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js",

 "http://wellstyled.com/files/jquery.debug/jquery.debug.js"

];

// 这两个文件分别是 jQuery 1.4.的库文件和 jQuery Debug 插件

// 然后你可以使用下面的方法调用并在成功后执行回调了。

parallelLoadScripts(scripts, function() { 

 /*

 debug = new $.debug({ 

  posTo : { x:'right', y:'bottom' },

  width: '480px',

  height: '50%',

  itempider : '<hr>',

  listDOM : 'all'

 });

 */

 console.log('脚本加载完成啦');

});

扩展知识

脚本加载后执行JS回调函数的方法的更多相关文章

  1. JQuery文档加载完成执行js的几种方法

    js中文档加载完毕.一般在body加一个onload事件或者window.onload = function () {} jQuery中有好多写法,平时也不注意,别人一问,还真觉得头大. 下面是我整理 ...

  2. 使用getScript()方法异步加载并执行js文件

    使用getScript()方法异步加载并执行js文件 使用getScript()方法异步请求并执行服务器中的JavaScript格式的文件,它的调用格式如下所示: jQuery.getScript(u ...

  3. JS脚本加载与执行对性能的影响

    高性能JavaScript-JS脚本加载与执行对性能的影响 在web产品优化准则中,很重要的一条是针对js脚本的加载和执行方式的优化.本篇文章简单描述一下其中的优化准则. 1. 脚本加载优化 1.1 ...

  4. 浏览器环境下Javascript脚本加载与执行探析之DOMContentLoaded

    在”浏览器环境下Javascript脚本加载与执行探析“系列文章的前几篇,分别针对浏览器环境下JavaScript加载与执行相关的知识点或者属性进行了探究,感兴趣的同学可以先行阅读前几篇文章,了解相关 ...

  5. 浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入

    在<浏览器环境下JavaScript脚本加载与执行探析之defer与async特性>中,我们研究了延迟脚本(defer)和异步脚本(async)的执行时机.浏览器支持情况.浏览器bug以及 ...

  6. C# dll 事件执行 js 回调函数

      C# dll 事件执行 js 回调函数   前言: 由于js 远程请求  XMLHttpRequest() 不支持多线程,所以用C# 写了个dll 多线程远程抓住供js调用. 最初代码为: C#代 ...

  7. 浏览器环境下JavaScript脚本加载与执行探析之defer与async特性

    defer和async特性相信是很多JavaScript开发者"熟悉而又不熟悉"的两个特性,从字面上来看,二者的功能很好理解,分别是"延迟脚本"和"异 ...

  8. 高性能JavaScript-JS脚本加载与执行对性能的影响

    在web产品优化准则中,很重要的一条是针对js脚本的加载和执行方式的优化.本篇文章简单描述一下其中的优化准则. 1. 脚本加载优化 1.1 脚本位置对性能的影响 优化页面加载性能的原则之一是将scri ...

  9. spring bean容器加载后执行初始化处理@PostConstruct

    先说业务场景,我在系统启动后想要维护一个List常驻内存,因为我可能经常需要查询它,但它很少更新,而且数据量不大,明显符合缓存的特质,但我又不像引入第三方缓存.现在的问题是,该List的内容是从数据库 ...

随机推荐

  1. 保姆级别学生党安装Clion IDE(面向华师同学)

    保姆级别学生党安装Clion IDE(面向华师同学) 界面UI 废话不多说,直接上图 具备功能 UI美观 (下面会介绍) 基础的代码编写能力 大容量的IDE插件 (下面会介绍) 代码补全,以及搭配Ki ...

  2. 使paramiko库执行命令时,在给定的时间强制退出

    原因: 使用paramiko库ssh连接到远端云主机上时,非常偶现卡死现象,连接无法退出(可以是执行命令时云主机重启等造成).需要给定一段时间,不管命令执行是否卡住,都退出连接,显示命令执行超时错误. ...

  3. python+unittest+ddt数据驱动进行接口自动化测试

    所谓数据驱动测试,简单的理解为数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变.通过使用数据驱动测试的方法,可以在需要验证多组数据测试场景中,使用外部数据源实现对输入输出与期望值的参数化,避 ...

  4. Docker安装开发环境

    目录 Docker Docker 安装 Mysql Docker 安装Redis Docker 安装Zookeeper Docker Docker 安装 Mysql Docker 查看可用Mysql镜 ...

  5. django框架如何解决跨域问题

    跨域问题的由来 由于浏览器具有同源策略的限制. 限制:在发送Ajax请求时,如果当前浏览器的URL是a.com,页面中向b.com发送Ajax请求,请求可以正常访问,但数据回到浏览器时,浏览器会阻止. ...

  6. 【.net core】三种注入方式的区别

    AddTransient瞬时模式:每次请求,都获取一个新的实例.即使同一个请求获取多次也会是不同的实例 AddScoped:每次请求,都获取一个新的实例.同一个请求获取多次会得到相同的实例 AddSi ...

  7. imagemagick 之 Fred's ImageMagick Scripts 在Ubuntu 下的实践

    Fred's ImageMagick Scripts 官网:http://www.fmwconcepts.com/imagemagick/index.php Windows 10 (64-bit) u ...

  8. cadence Virtuoso ADE原理图AnalogLib库中的switch使用

    Symbol: switch A,B:等效于一个电阻; C,D:等效于控制开关(CD间的控制电压控制AB的断开或闭合); open switch resistance:开关断开状态下的等效电阻(AB之 ...

  9. KubeEdge云边协同设计原理

    云端组件CloudCore与k8s Master的关系 从黑盒角度看,CloudCore就是k8s的一个插件,它是非侵入的来扩展k8s的一部分功能,将原来云上的节点映射到边缘端进行管理,一个Cloud ...

  10. go的令牌桶实现库 go-rate

    关于我 我的博客|文章首发 go-rate是速率限制器库,基于 Token Bucket(令牌桶)算法实现. go-rate被用在LangTrend的生产中 用于遵守GitHub API速率限制. 速 ...