动态脚本简单示例

// 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. LeetCode-二叉搜索树的第k大节点

    二叉搜索树的第k大节点 LeetCode-面试题54 需要充分了解二叉搜索树的性质. 利用中序遍历的思想,采用相反的思想:先遍历右节点再遍历左节点. /** * 给定一棵二叉搜索树,请找出其中第k大的 ...

  2. Linux下查看文件内容的几种常用命令

    [常用] 1,cat     由第一行开始显示内容,并将所有内容输出 cat的功能是将文件从第一行开始连续的将内容输出在屏幕上.但是cat并不常用,原因是当文件大,行数比较多时,屏幕无法全部容下时,只 ...

  3. MySQL数据库之一

    数据库简介 数据库分类 关系型数据库(SQL):(狭义可以理解为行和列) MySQL,Oracle,Sql Server, DB2 通过表和表之间,行和列之间的关系进行存储 非关系型数据库(NoSQL ...

  4. linux下redis安装运行教程——redis系列

    天没降大任于我,照样苦我心智,劳我筋骨. 安装运行的过程 由于官网太慢,csdn里的资源又要钱,所以呢,只能使用我自己本地以前下载的陈年..哦不,3.xredis安装包 资源已经放到百度云,需要的可以 ...

  5. 关于ORACLE数据库跨库调用序列的解决办法

    问题  ORACLE  数据库   用户1   xscg  有序列      seq_S_ATTACHMENT_INFO.nextval         我要在  用户2   xsds   里面调用 ...

  6. 200-Java语言基础-Java编程入门-006 | Java数组定义及使用(引用数据类型)

    一.数组概述和定义格式说明 为什么要有数组(容器): 为了存储同种数据类型的多个值 数组概念: 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数据类型,也可以存储引 ...

  7. 2018.9.9 nowcoder 普及组第一场

    2018.9.9 nowcoder 普及组第一场 C-括号 题目大意:一个只包含左右括号的字符串\(S\),希望删掉S中若干个字符,使得剩下的字符串是一个合法的括号串,有多少不同的方案. Soluti ...

  8. Codeforces Round #533 C. Ayoub and Lost Array

    题面: 传送门 题目描述: 题意很简单:1.数组中的所有整数都在区间[l, r],2.所有元素之和能被3整除.现在知道这个数组的大小,l和r,问:按照题目的要求组成的数组一共有多少种可能.   题目分 ...

  9. golang 矩阵乘法、行列式、求逆矩阵

    package matrix import ( "math" "github.com/astaxie/beego" ) type Matrix4 struct ...

  10. python之commands和subprocess入门介绍(可执行shell命令的模块)

    一.commands模块 1.介绍 当我们使用Python进行编码的时候,但是又想运行一些shell命令,去创建文件夹.移动文件等等操作时,我们可以使用一些Python库去执行shell命令. com ...