Звонок на getJSON()
является асинхронным;результат не доступен сразу.Из getJSON()
возвращается объект jqXHR
, который отслеживает состояние асинхронного запроса.
Вам необходимо зарегистрировать обратный вызов (для этого и предназначен второй параметр), который выполняется после ответа.Объект jqXHR
, который обрабатывает асинхронный запрос, автоматически выполнит ваш обратный вызов после успешного завершения запроса.
$('#courseSelect').bind('change', function() {
$.getJSON('lessons.js', function(data) {
var html = '<select name="lessonSelect id="lessonSelect">';
var len = data.length;
alert(data.length); //this alerts "undefined"
for (var i = 0; i < len; i++) {
html += '<option value="' + data[i].value + '">' + data[i].name + '</option>';
}
html += '</select>';
alert(html); //this alerts <select...></select>
//but no option tags because there's nothing to loop through
$('lessonsDiv').html(html);
});
});
Как только вы это сделаете, data
будет таким объектом, как;
var data = {"lessons":
[
{"value": "1", "name": "Lesson 1"},
{"value": "2", "name": "Lesson 2"},
{"value": "3", "name": "Three"}
]
};
Таким образом, вам действительно нужно использовать data.lessons
для доступа к полученному массиву (и data.lessons.length
для получения его длины).