2010-10-25 65 views
0

我有两个数组。注册JavaScript文件和从属代码

  1. 我正在使用$ .getScript(url)注册的JavaScript文件的URL列表。
  2. 内嵌的列表JavaScript命令与$( “HTML”)进行登记。追加(内联)

中的任何项目(2)可以是依赖于(1)中的任何项目。这意味着我必须确保(1)中的所有项目在注册(2)之前完成加载。

我想加载所有的异步(1)...因为它会更快,但我如何确保所有这些过程已完成之前注册(2)?

+0

事实证明,这其实是非常棘手的事情,并改变了很多,从浏览器到浏览器。比如LabJS和RequireJS是需要考虑的方法,但是更新的浏览器版本会导致问题。 – Pointy 2010-10-25 16:56:14

回答

1

我觉得这个事情应该工作:

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]); 
} 
0

您可以将(2)添加到ajax调用的成功处理程序中。

+0

问题是有多个ajax调用。 (1)中的每个文件一个。 – SystemicPlural 2010-10-25 16:50:58

+0

在成功处理程序中,它可以在数组(2)中查找任何相关的命令,如果您想要进行某种关联的麻烦。对不起,我无法集思广益一个更好的解决方案。 – Orbit 2010-10-25 16:54:01

1

这应该在我看来是通过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*/ }); 
+0

感谢您的输入hjhndr。我认为你所建议的是我创建了一个在数据加载后调用的回调函数。我不认为它会工作,因为加载文件只有自己的回调完成...其中有多个...自定义回调将执行得太早。 – SystemicPlural 2010-10-26 10:25:50