我试图让我的$ .getJSON工作,但它什么也没有返回。这是我的jQuery:
$('#courseSelect').bind('change', function()
{
data = $.getJSON('lessons.js');
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);
});
这是我的课程.js文件
{"lessons":
[
{"value": "1", "name": "Lesson 1"},
{"value": "2", "name": "Lesson 2"},
{"value": "3", "name": "Three"}
]
}
最终,我要做的是在选择课程时创建一个新的课程选择列表。但就目前而言,我只是想让这个getJSON方法起作用,但事实并非如此。如果有人能看出有什么问题,那就太棒了。它期待不同类型的数据吗?
答案 0 :(得分:7)
对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
来检索它的长度。)
答案 1 :(得分:2)
您的以下代码:
data = $.getJSON('lessons.js')
不起作用。 AJAX不是同步的。它是,as its name says,异步。这意味着你不要等到答案回来。您指定一个回调函数来处理收到的数据。
例如:
$.getJSON('lessons.js', handleDatas)
// This function will be executed when the datas come back
function handleDatas(data) {
// use the `data` variable here
}
虽然它通常以这种方式使用:
$.getJSON('lessons.js', function(data) {
// use the `data` variable here
}
在那里,我们使用匿名函数作为回调。
有关详细信息,请查看jQuery documentation上的示例。