我需要添加原型然后添加scriptaculous并在完成加载时获得回调。我目前正在加载原型:
var script = document.createElement("script");
script.src = "http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js";
script.onload = script.onreadystatechange = callback;
document.body.appendChild( script );
我可以通过链接回调来做到这一点,但这似乎是不好的做法(当我需要加载更多脚本时,我不想要一个愚蠢的20个回调方法链)。想法?
答案 0 :(得分:39)
我建议你使用一些小型装载机,它会链接并为你做一些东西。比如这个:
function loadScripts(array,callback){
var loader = function(src,handler){
var script = document.createElement("script");
script.src = src;
script.onload = script.onreadystatechange = function(){
script.onreadystatechange = script.onload = null;
handler();
}
var head = document.getElementsByTagName("head")[0];
(head || document.body).appendChild( script );
};
(function run(){
if(array.length!=0){
loader(array.shift(), run);
}else{
callback && callback();
}
})();
}
此脚本应该可以帮助您构建脚本标记并在加载所有文件时调用回调。调用非常简单:
loadScripts([
"http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js",
"http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js"
],function(){
alert('All things are loaded');
});
希望这会有所帮助
答案 1 :(得分:2)
由于Internet Explorer中的错误,来自nemisj的递归加载程序在IE中无法正常工作。可以通过在递归调用上设置延迟来解决,如:
function loadScripts(array,callback){
var loader = function(src,handler){
var script = document.createElement("script");
script.src = src;
script.onload = script.onreadystatechange = function(){
script.onreadystatechange = script.onload = null;
if(/MSIE ([6-9]+\.\d+);/.test(navigator.userAgent))window.setTimeout(function(){handler();},8,this);
else handler();
}
var head = document.getElementsByTagName("head")[0];
(head || document.body).appendChild( script );
};
(function(){
if(array.length!=0){
loader(array.shift(),arguments.callee);
}else{
callback && callback();
}
})();
}
当一个无法解释的问题发生时,这个小黑客就会这样做,并且通常是IE中的解决方案,这种情况经常发生。
答案 2 :(得分:1)
由于scriptaculous需要原型,因此您必须使用用于加载这些脚本的任何方法来链接侦听器。
有各种脚本加载器可以尽可能快地并行加载脚本,例如: LABjs,但在这种情况下没有一个会有所帮助。
如果您最终要加载10-20个脚本,我建议您使用Combiner等工具预先合并脚本。
答案 3 :(得分:0)
您可以实现script's .onload
和.onerror
回调,然后使用Promise.all
等待所有的承诺解决,然后再继续执行依赖于这些承诺的执行脚本。
这是一个例子:
const loadScript = url =>
new Promise((resolve, reject) => {
const script = document.createElement("script");
script.src = url;
script.onload = resolve;
script.onerror = e =>
reject(Error(`${url} failed to load`))
;
document.head.appendChild(script);
})
;
const scriptURLs = [
"https://unpkg.com/htm",
"https://unpkg.com/axios@0.21.0/dist/axios.min.js",
"https://cdnjs.cloudflare.com/ajax/libs/d3/6.3.1/d3.min.js",
// ...
];
Promise.all(scriptURLs.map(loadScript))
.then(async () => {
/* Use your scripts here */
console.log("proving scripts loaded:");
axios.get("http://jsonplaceholder.typicode.com/users");
console.log(d3.csvParse("a,b\n3,4\n5,6"));
const html = htm.bind((t, p, ...c) => ({t, p, c}));
console.log(html`<h1 id=hello>Hello world!</h1>`);
})
.catch(err => console.error(err))
;