为什么我不能立即使用$ .getJSON()的结果?

时间:2012-03-08 11:37:09

标签: jquery json getjson

我试图让我的$ .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方法起作用,但事实并非如此。如果有人能看出有什么问题,那就太棒了。它期待不同类型的数据吗?

2 个答案:

答案 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上的示例。