这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章主要为大家详细介绍了 JS 动态加载脚本并下载完成后执行回调操作,感兴趣的小伙伴们可以参考一下
关于在 javascript 里面加载其它的 js 文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的 js 文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的。本文讲解怎么在 js 中加载其它 js 文件并在加载完成后执行回调函数。
我们可以动态的创建 经过对网络上资源的搜索,我发现在 IE 浏览器中可以使用
一个简单的实现过程看上去是下面这样的:
- //IE下:
- var script = document.createElement("script");
- script.setAttribute("type","text/javascript");
- script.onreadystatechange = function() {
- if(this.readyState == "loaded" || this.readyState == "complete"){
- alert("加载成功啦!");
- }
- }
- script.setAttribute("src",scripts[i]);
- //Opera、FF、Chrome等:
- var script = document.createElement("script");
- script.setAttribute("type","text/javascript");
- script.onload = function() {
- alert("加载成功啦!");
- }
- script.setAttribute("src",scripts[i]);
原理很简单,根据这两个简单的原理,我们进行一些修改,我把改成了两个函数,分别是串行加载和并行加载脚本。
当传一个包含多个 JS 文件路径的数组时,串行加载函数从第一个脚本文件加载开始,每加载成功一个便开始加载下一个脚本文件,全部加载完成后执行回调函数。而并行加载是一开始便加载全部的脚本文件,也就是他们从同一点开始加载,当全部加载完成后,执行回调函数。
经过测试,这两个函数兼容目前的所有主流浏览器。
- /**
- * 串联加载指定的脚本
- * 串联加载[异步]逐个加载,每个加载完成后加载下一个
- * 全部加载完成后执行回调
- * @param array|string 指定的脚本们
- * @param function 成功后回调的函数
- * @return array 所有生成的脚本元素对象数组
- */
- function seriesLoadScripts(scripts, callback) {
- if (typeof(scripts) != "object") var scripts = [scripts];
- var HEAD = document.getElementsByTagName("head").item(0) || document.documentElement;
- var s = new Array(),
- last = scripts.length - 1,
- recursiveLoad = function(i) { //递归
- s[i] = document.createElement("script");
- s[i].setAttribute("type", "text/javascript");
- s[i].onload = s[i].onreadystatechange = function() { //Attach handlers for all browsers
- 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 指定的脚本们
- * @param function 成功后回调的函数
- * @return array 所有生成的脚本元素对象数组
- */
- function parallelLoadScripts(scripts, callback) {
- if (typeof(scripts) != "object") var scripts = [scripts];
- var HEAD = document.getElementsByTagName("head").item(0) || document.documentElement,
- s = new Array(),
- loaded = 0;
- for (var i = 0; i < scripts.length; i++) {
- s[i] = document.createElement("script");
- s[i].setAttribute("type", "text/javascript");
- s[i].onload = s[i].onreadystatechange = function() { //Attach handlers for all browsers
- 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]);
- }
- }
在这里是把 细心的你还会发现,这里使用了一种称作条件编译的方法作为表达式(!/*@cc_on!@*/0)来判断是否非 IE 浏览器,关于条件编译并不是本文的重点,有兴趣的您可以上网查找相关资料进行学习。
这两个函数的使用方法: 这里我们声明了一个数组变量,里面包含了两个远程的 JS 文件地址(当然 <script> 标签调用脚本是支持跨域的):
- 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 插件
- //然后你可以使用下面的方法调用并在成功后执行回调了。
- seriesLoadScripts(scripts,function(){
- /*
- debug = new $.debug({
- posTo : { x:'right', y:'bottom' },
- width: '480px',
- height: '50%',
- itemDivider : '<hr>',
- listDOM : 'all'
- });
- */
- alert('脚本加载完成啦');
- });
这里使用的是串联加载的函数,当然你也可以使用并联加载函数,这可以根据情况使用,建议每下一个脚本对上一个脚本有依赖性的使用串联加载,否则使用并联,因为原理上并联要比串联快那么些。
来源: http://www.phperz.com/article/17/0524/332375.html