Josep 是对的,如果它在您使用 alert() 时起作用,那是因为那会阻塞执行,这为 ajax 调用工作和回调提供了时间执行。
然而,与其重构你的代码——你可以将调用移到$.liteAccordion()
回调中。例如:
$(document).ready(function () {
$('head').append("<script id='templateHolder' type='text/template'></script");
$('#templateHolder').load('templates/template.html', function () {
var scripts = ['js/liteaccordion.jquery.js', 'js/mustache.js']; //add as many script as required here
for (var i = 0; i < scripts.length; i++) {
$.getScript(scripts[i], function () {
$.getJSON('json/data.json', function (data) {
var template = $('#templateHolder').html();
var info = Mustache.to_html(template, data);
$('.jsoncontent').html(info);
$('.jsoncontent').liteAccordion(); //move here
}); //eof .getJSON
}); //eof .getScript()
} //eof for()
}); //eof load()
}); //eof ready()
但是,我对您使用的选择有点好奇$.getScript()
——因为循环中的代码for()
实际上并不需要像那样运行;为每个脚本获取一次 JSON 是没有意义的;最好是获取每个脚本,然后获取 JSON 一次.. 例如..
$(document).ready(function () {
$('head').append("<script id='templateHolder' type='text/template'></script");
$('#templateHolder').load('templates/template.html', function () {
var scripts = ['js/liteaccordion.jquery.js', 'js/mustache.js']; //add as many script as required here
for (var i = 0; i < scripts.length; i++) {
$.getScript(scripts[i], function () {
//just get the script; this callback doesn't need to do anything really
}); //eof .getScript()
} //eof for()
/* we're out of the for() loop now, so this will only make the call
once; however - all our scripts are loaded so it will work */
$.getJSON('json/data.json', function (data) {
var template = $('#templateHolder').html();
var info = Mustache.to_html(template, data);
$('.jsoncontent').html(info);
$('.jsoncontent').liteAccordion(); //move here
}); //eof .getJSON
}); //eof load()
}); //eof ready()
此解决方案再次将$.liteAcordion()
调用置于回调中,因此它将在 Mustache.js 被调用后执行。
值得记住 AJAX 有时是异步的,因为如果您不充分利用回调函数等,它可能会导致头痛。
但是,正如@Josep 在下面的评论中指出的那样,您仍然冒着$.getScript()
尚未完成执行的风险;对于您在阵列中包含的更多脚本,这将是一个问题。
$.getJSON()
考虑到这一点,从for()
循环中进行轻微的重构和调用可能会很好;但确保它绝对是最后一次迭代。(编辑:我看到 Jesop 实际上有一个相同的解决方案 - 我知道我们大多数人都在这里获得积分,但如果你要接受答案 - 接受他的答案,他先到了那里;))
$(document).ready(function () {
$('head').append("<script id='templateHolder' type='text/template'></script");
$('#templateHolder').load('templates/template.html', function () {
var scripts = ['js/liteaccordion.jquery.js', 'js/mustache.js']; //add as many script as required here
for (var i = 0; i < scripts.length; i++) {
$.getScript(scripts[i], function () {
if( i == (scripts.length -1) )
$.getJSON('json/data.json', function (data) {
var template = $('#templateHolder').html();
var info = Mustache.to_html(template, data);
$('.jsoncontent').html(info);
$('.jsoncontent').liteAccordion(); //move here
}); //eof .getJSON
}); //eof .getScript()
} //eof for()
}); //eof load()
}); //eof ready()