javascript库的延迟加载
如果只是简单的让js延迟加载,那只需要在页面尾部加上这样的代码:
var oHead = document.getElementsByTagName('HEAD').item(0);
var oScript= document.createElement("script");
oScript.id = id;
oScript.type = "text/javascript";
oScript.src=src;
oHead.appendChild(oScript);
但这样加载有个问题,如果我立刻在后面调用这个延迟加载的js里面的方法或者变量就会报错,因为新加载的js还没执行完呢。并且document的onload方法不会等待这样的延迟js加载成功。
还有就是这样加载的js不能保证顺序。也就是不能保证先append的js先执行。如果后面的js依赖于前面的js,而前面的js比较大,加载延迟,则后面的js执行的时候就可能报错。
我在修改这个高亮代码的脚本的时候就遇到了这样的问题。
并不是所有的文章都有代码,并且每篇文章可能出现的代码语言不一样,需要根据内容加载不同的库。
shCore.js是核心js,需要先加载。然后是各个语言的js,具体取决于文章内容中出现的代码语言。如 shBrushJava.js,shBrushBash.js等。
后面这些js都依赖于shCore.js。当所有的js都加载完的时候,才能调用:
SyntaxHighlighter.highlight();
高亮代码。
参考了一些文章,终于弄出一个解决方案:
if(!window.BrushUtils) var BrushUtils = (function(){
var ut = {
baseurl:"",
resources:[],
brushMap : {js:"JScript",jscript:"JScript",javascript:"JScript",
bash:"Bash",shell:"Bash",css:"Css",actionscript3:"AS3",as3:"AS3",cpp:"Cpp",c:"Cpp",
csharp:"CSharp",groovy:"Groovy",java:"Java",javafx:"JavaFX",jfx:"JavaFX",
perl:"Perl",pl:"Perl",php:"Php",text:"Plain",plain:"Plain",py:"Python",python:"Python",
ruby:"Ruby",ror:"Ruby",rails:"Ruby",scala:"Scala",sql:"Sql",xml:"Xml",html:"Xml",xhtml:"Xml",xslt:"Xml"
},
parseBrush :function(){
var pres = document.getElementsByTagName("pre");
var brushs = new Array();
for(var i=0;i0?function(){ut.loadNext();}:function(){SyntaxHighlighter.config.clipboardSwf = ut.baseurl 'scripts/clipboard.swf';SyntaxHighlighter.highlight();};
if(resource.type=='js'){
ut.loadJs(resource.url,callback);
}else if(resource.type='css'){
ut.loadStyle(resource.url,callback);
}
}
},
loadJs : function(src,callback){
var scriptTags = document.getElementsByTagName('script');
var oHead = document.getElementsByTagName('HEAD').item(0);
var script= document.createElement("script");
script.type = "text/javascript";
script.src=src;
script.onreadystatechange= function () {
if (this.readyState == 'loaded' || this.readyState == 'complete') {
callback();
}
}
script.onload= callback;
oHead.appendChild(script);
},
loadStyle : function(url){
var oHead = document.getElementsByTagName('HEAD').item(0);
var style= document.createElement("link");
style.type = "text/css";
style.rel="stylesheet";
style.href=url;
oHead.appendChild(style);
}
};
return ut;
})();
调用:
var syntaxhighlighter_url = "/scripts/syntaxhighlighter/";
BrushUtils.loadLibs(syntaxhighlighter_url);
主要在于对script的加载成功事件的监听。ie的事件是onreadystatechange,firefox的是onload.把需要加载的js放在一个队列里,当前一个加载完成时候,从队列里取出下一个js,继续加载。
经过测试,这个方法在ie,firefox,opera上都可以使用。但据说Safari上是没这个事件的(未测试)。
本来想给样式表也加上事件监听,结果发现样式表加载成功在firefox下是不触发事件的,ie下可以。
参考网址:
http://unixpapa.com/js/dyna.html