Javascript多重动态插入
当我们为javascript进行动态插入时,有时顺序很重要。我们有时通过使用onload属性来解决这个问题;然而,如果有许多外部Java脚本,并且这些脚本必须按顺序加载,那么我们应该怎么做 我通过递归定义的onload函数解决了这个问题;然而,我对效率不是很确定。。。由于这是一个脚本,我认为它可以进行惰性评估。。。。有什么帮助吗Javascript多重动态插入,javascript,dynamic,recursion,onload,insertion,Javascript,Dynamic,Recursion,Onload,Insertion,当我们为javascript进行动态插入时,有时顺序很重要。我们有时通过使用onload属性来解决这个问题;然而,如果有许多外部Java脚本,并且这些脚本必须按顺序加载,那么我们应该怎么做 我通过递归定义的onload函数解决了这个问题;然而,我对效率不是很确定。。。由于这是一个脚本,我认为它可以进行惰性评估。。。。有什么帮助吗 //recursively create external javascript loading chain //cautiously add url list acc
//recursively create external javascript loading chain
//cautiously add url list according to the loading order
//this function takes a list of urls of external javascript
function loadScript(url) {
if( url.length == 0) {
//final function to execute
return FUNCTION;
}
var f = function(){
var script = document.createElement("script");
script.type = "text/javascript";
script.src = url.pop();
//recursion
script.onload = loadScript(url) ;
document.getElementsByTagName("head")[0].appendChild(script);
}
return f;
}
function loadScripts(urls) {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = urls.pop();
script.onload = loadScript(urls) ;
document.getElementsByTagName("head")[0];.appendChild(script);
}
loadScripts(["aaa.js","bbb.js","ccc.js"]);
谢谢大家!
-对不起,把你弄糊涂了。。我添加了一个实际调用loadScript()的函数。(我检查了这个功能。)为什么不按正确的顺序将链接添加到javascript中,然后开始使用像jQuery这样的javascript库?有一种方法可以使用。
看看这个链接,演示就是它。我不知道如何使用这个loadScript函数,看起来比它可能需要的要混乱得多 如果您想按顺序加载脚本,为什么不按您想加载的顺序列出它们,然后加载第一个呢。加载完成后,更新列表以删除刚加载的列表并加载下一个列表,等等 下面是一些可以做到这一点的代码,这些代码应该与浏览器使用的脚本加载检测机制一起工作,并将一直等到调用onload函数(或readystatechange通知),直到加载下一个脚本:
function loadScriptsSequential(scriptsToLoad) {
function loadNextScript() {
var done = false;
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.onreadystatechange = function () {
if (this.readyState == 'complete' || this.readyState == 'loaded') {
scriptLoaded();
}
}
script.onload = scriptLoaded;
script.src = scriptsToLoad.shift(); // grab next script off front of array
head.appendChild(script);
function scriptLoaded() {
// check done variable to make sure we aren't getting notified more than once on the same script
if (!done) {
script.onreadystatechange = script.onload = null; // kill memory leak in IE
done = true;
if (scriptsToLoad.length != 0) {
loadNextScript();
}
}
}
}
loadNextScript();
}
var scripts = [a,b,c,d,e,f]; // scripts to load in sequential order
loadScriptsSequential(scripts);
正如其他人所提到的,有一些非常有用的框架(如jQuery)具有用于加载脚本的内置函数。我添加了一行代码,实际上调用了加载脚本。。。很抱歉造成混淆,谢谢您的评论。您是否考虑过使用现成的加载程序(如requireJS)或支持模块的JS框架(如Dojo)?