动态脚本简单示例

// 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. Linux graphics stack

    2D图形架构 早期Linux图形系统的显示全部依赖X Server,X Client调用Xlib提供的借口向 X Server发送渲染命令,X Server根据 X Client的命令请求向硬件设备绘 ...

  2. Spirent Tester二层裸流配置

    1.OLT配置 配一个VLAN,若GE口打Tag,不需要打PVID,打Untag,配PVID. 在ONU上配一个Other Bridge Wan链接. 2.TestCenter配置 选定两个TestC ...

  3. vue关于导航守卫的几种应用场景

    beforeEach 该钩子函数主要用来做权限的管理认证 router.beforeEach((to, from, next) => { if (to.matched.some(record = ...

  4. CSS:CSS基础

    和 HTML 类似,CSS 也不是真正的编程语言,甚至不是标记语言.它是一门样式表语言,这也就是说人们可以用它来选择性地为 HTML 元素添加样式. CSS规则集 选择器(Selector):元素的名 ...

  5. 【Saas-export项目】--项目整合(spring整合MVC)

    转: [Saas-export项目]--项目整合(spring整合MVC) 文章目录 Spring整合SpringMVC(export_web_manager子工程) (1)log4j.propert ...

  6. pytorch(00)

    pytorch入门到项目(-) 一.pytorch的环境 本身项目采用win10系统+pycharm+anaconda+cuda. 其中版本为 python 3.7 anaconda 5.3.1 cu ...

  7. Linux速通05 文件处理与编辑

    使用 cat 命令进行文件的纵向合并 # 例:使用 cat 命令将 baby.age.baby.weight.baby.sex 这三个文件纵向合并为 baby文件 * cat baby.age bab ...

  8. beego框架panic: 'GetSecurityInf' method doesn't exist in the controller CorporateInfcontroller问题解决

    在使用beego框架时,出现类似于panic: 'GetSecurityInf' method doesn't exist in the controller CorporateInfcontroll ...

  9. 梳理一下最近准备蓝桥杯时学习DP问题的想法

    学习时间不长,记录的只是学习过程的思路和想法,不能保证正确,代码可以在acwing上AC. 01背包问题: 1.首先是简单的01背包问题 2.先确定状态,f[i][j]表示有第i件物品,时间为j的最大 ...

  10. 201871030131-谢林江 实验二 个人项目—《D{0-1} KP》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.学习编写PSP2.完成个人项目实验要求3.在Github建仓 这个作业在哪些方面帮助我实现学习目标 1.首次编 ...