我有两个数组。注册JavaScript文件和从属代码
- 我正在使用$ .getScript(url)注册的JavaScript文件的URL列表。
- 内嵌的列表JavaScript命令与$( “HTML”)进行登记。追加(内联)
中的任何项目(2)可以是依赖于(1)中的任何项目。这意味着我必须确保(1)中的所有项目在注册(2)之前完成加载。
我想加载所有的异步(1)...因为它会更快,但我如何确保所有这些过程已完成之前注册(2)?
我有两个数组。注册JavaScript文件和从属代码
中的任何项目(2)可以是依赖于(1)中的任何项目。这意味着我必须确保(1)中的所有项目在注册(2)之前完成加载。
我想加载所有的异步(1)...因为它会更快,但我如何确保所有这些过程已完成之前注册(2)?
我觉得这个事情应该工作:
var scripts = [
{"src": "script1", "loaded": false},
{"src": "script2", "loaded": false},
{"src": "script3", "loaded": false},
]
var commands = ["cmd1","cmd2","cmd3"];
for (var i = 0, l = scripts.length; i<l; i++){
(function (script){
$.ajax({
url: script.src,
dataType: 'script',
success: function(){
for (var k = scripts.length; k--;){
if (scripts[k].src === script.src){
scripts[k].loaded = true;
}
}
var allReady = true;
for (var k = scripts.length; k--;){
if (!scripts[k].loaded){
allReady = false;
}
}
if (allReady){
/*execute your inline commands*/
}
}
});
})(scripts[i]);
}
您可以将(2)添加到ajax调用的成功处理程序中。
问题是有多个ajax调用。 (1)中的每个文件一个。 – SystemicPlural 2010-10-25 16:50:58
在成功处理程序中,它可以在数组(2)中查找任何相关的命令,如果您想要进行某种关联的麻烦。对不起,我无法集思广益一个更好的解决方案。 – Orbit 2010-10-25 16:54:01
这应该在我看来是通过jQuery的回调容量可解;请参阅简洁的使用说明here,希望这有助于。
编辑:这里的实际代码:
$.extend({myFunc : function(someArg, callbackFnk){
// load files here
var data = 'test';
// now call function for inline loading
if(typeof callbackFnk == 'function'){
callbackFnk.call(this, data);
}}});
$.myFunc(someArg, function(arg){ */here goes inline load*/ });
感谢您的输入hjhndr。我认为你所建议的是我创建了一个在数据加载后调用的回调函数。我不认为它会工作,因为加载文件只有自己的回调完成...其中有多个...自定义回调将执行得太早。 – SystemicPlural 2010-10-26 10:25:50
事实证明,这其实是非常棘手的事情,并改变了很多,从浏览器到浏览器。比如LabJS和RequireJS是需要考虑的方法,但是更新的浏览器版本会导致问题。 – Pointy 2010-10-25 16:56:14