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()
は実際にはそのように実行する必要がないため、使用の選択については少し興味があります。スクリプトごとに 1 回ずつ 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()