2014-07-14 101 views
0

任何人都有类似的体验吗?我发现jQuery没有按顺序加载脚本。下面是我调用的脚本,我不知道调用代码的顺序。在代码中,首先调用validation.js,然后调用c_validation.js,但在Chrome Javascript Console中,加载脚本的结果反转。这是由脚本的大小造成的吗?我如何强制脚本逐个加载?如何按顺序加载外部脚本

$("#tab-4-content").load("/reg.php?id="+this.id+"&ads="+$(this).data('ads')+"&f="+$(this).data('file')+"&mid="+$(this).data('mid')); 
    var url = "http://mydomain.com/validation.js"; 
    $.getScript(url) 
    .done(function() { 
     console.log("Success load validation"); 
    }) 
    .fail(function() { 
     console.log("Failed load validation"); 
     }); 
    var url = "js/c_validate.js"; 
    $.getScript(url) 
     .done(function() { 
      console.log("Success load c_validate.js"); 
     }) 
     .fail(function() { 
      console.log("Failed load c_validate.js"); 
     }); 
    $.mobile.changePage("#tab-4"); 
    $("#terms").html("/dev/terms.inc.html"); 
}); // tab-3-content click 

XHR finished loading: GET "http://dev.mydomain.com/c_by_cat.inc.php?id=code". jquery.js:10306 
http://mydomain.com/validation.js js.php?id=code:92 
XHR finished loading: GET "http://dev.mydomain.com/js/c_validate.js?_=1405324184667". jquery.js:10306 
Failed load c_validate.js js.php?id=code:106 
XHR finished loading: GET "http://dev.mydomain.com/reg.php?id=3&ads=1&f=3.png&mid=2". jquery.js:10306 
Success load validation 
+0

为什么你会加载使用$ .getScript所有的脚本? – adeneo

+0

你为什么不使用'Script'标签? – christiandev

+0

该脚本只会在特定页面上被调用,具体取决于访问者是否点击它。 – Kelvin

回答

1

发生这种情况是因为您触发了并行请求。您可以使用类似的东西:

var get_scripts_in_order = function(urls, def) { 
    if (def === undefined) { 
     def = $.Deferred(); 
    } 
    var url = urls.pop(); 
    if (url === undefined) { 
     def.resolve(); 
    } else { 
     $.getScript(url) 
      .done(function() { 
       get_scripts_in_order(urls, def); 
      }) 
      .fail(function() { 
       def.reject(url); 
      }); 
    } 
    return def.promise(); 
}; 

get_scripts_in_order(["script3.js", "script2.js", "script1.js"]) 
    .done(function() { 
     console.log("loaded all scripts"); 
    }) 
    .fail(function(url) { 
     console.log("fail: "+url); 
    }); 

请注意,URL的顺序由于.pop而发生逆转。

有jQuery的一个有趣的插件,它可以帮助你还有:

https://github.com/gnarf/jquery-ajaxQueue