动态脚本简单示例

// 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. Git:本地仓库管理

    git log:查看 commit 提交历史 git log --pretty=oneline:简化log输出内容 git reflog:查看每一次命令的历史记录 版本回退 git reset HEA ...

  2. Salesforce LWC学习(三十一) Quick Action适配

    本篇参考:https://www.lightningdesignsystem.com/components/modals/ 随着salesforce lwc的优化,越来越多的项目从aura转到了lwc ...

  3. Java I/O流 02

    IO流·字节流 IO流概述及其分类 * A:概念 * IO流用来处理设备之间的数据传输 * Java对数据的操作是通过流操作的 * Java用于操作流的类都在IO包中 * 流按流向分为两种输入流.输出 ...

  4. Java数据持久层

    一.前言 1.持久层 Java数据持久层,其本身是为了实现与数据源进行数据交互的存在,其目的是通过分层架构风格,进行应用&数据的解耦. 我从整体角度,依次阐述JDBC.Mybatis.Myba ...

  5. 对于如何从SM2的pfx证书文件中解析公钥和私钥,并从二次加密的密文中解密

    首先呢,由于我的域名之前处理点问题,然后备案第二个网站时候,第一个网站没法访问,所以备案没过,阿里云告诉我要删除一个网站的备案,但是他没告诉我要删除主体,所以我的备案主体成了空壳主体,要传真或者发快递 ...

  6. FreeBSD Fcitx 输入法框架设置

    #FreeBSD# 在.cshrc和/etc/csh.cshrc中进行如下配置,此配置可以解决部分窗口fcitx无效的问题. setenv QT4_IM_MODULE fcitx setenv GTK ...

  7. C# 应用 - 使用 HttpListener 接受 Http 请求

    1. 库类: \Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.dll System.Net.HttpListen ...

  8. HDU_3949 XOR 【线性基】

    一.题目 XOR 二.分析 给定$N$个数,问它的任意子集异或产生的数进行排列,求第K小的数. 构造出线性基$B$后,如果$|B| < N$,那么代表N个数中有一个数是可以由线性基中的其他数异或 ...

  9. 【图像处理】OpenCV+Python图像处理入门教程(五)阈值处理

    这篇随笔介绍使用OpenCV进行图像处理的第五章 阈值处理. 5  阈值处理 阈值是指像素到达某临界值.阈值处理表示像素到达某临界值后,对该像素点进行操作和处理. 例如:设定一幅图像素阈值为200,则 ...

  10. 下载微软pdb符号文件

    使用symchk.exe  逐层下载c:\windows\system32下的pdb文件 symchk /r c:\windows\system32 /s SRV*D:\mypdb\*http://m ...