2

当我在 firebug 中逐步执行此 javascript 代码 (scoreboard.js) 时,它可以很好地处理警报。当我没有在 firebug 中放置换行符并正常运行它时,我收到一条“favs is null”消息(没有警报)。

var favs = $.getJSON("favs.json");
favs = $.parseJSON(favs.responseText);
favs = favs.myTeams;

for (i=0; i<favs.length; i++){
    alert(favs[i].text);
}

JSON (favs.json)

{"myTeams":[{"sport":10,"id":10,"abbrev":"NYY","isFav":false,"text":"New York  Yankees","sw_abbrev":"nyy"},{"sport":28,"id":19,"abbrev":"nyg","isFav":false,"text":"New York Giants","sw_abbrev":"nyg"},{"sport":46,"id":18,"abbrev":"NY","isFav":false,"text":"New York Knicks","sw_abbrev":"nyk"},{"sport":90,"id":11,"abbrev":"NJ","isFav":false,"text":"New Jersey Devils","sw_abbrev":"njd"},{"sport":41,"id":2507,"abbrev":"PROV","isFav":false,"text":"Providence Friars"},{"sport":46,"id":17,"abbrev":"NJ","isFav":false,"text":"New Jersey Nets","sw_abbrev":"njn"},{"sport":600,"id":363,"abbrev":"Blues","isFav":false,"text":"Chelsea","sw_abbrev":"ENG.CHELSEA","isNational":false}]}

的HTML

<html>
<head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
    <script type="text/javascript" src="scoreboard.js"></script>        
</head>

<body>
    Test
</body>

知道这里发生了什么吗?

4

5 回答 5

2

你不需要

favs = $.parseJSON(favs.responseText); 

而且我很确定$.getJSON()不会返回 json,而是返回jqXHR

查看parseJSON()的文档,您可能应该这样做:

jQuery.getJSON( url [, data] [, success(data, textStatus, jqXHR)] )

$.getJSON("favs.json",
          function(json)
{
  var favs = json.myTeams;  

  for (i=0; i<favs.length; i++){  
    alert(favs[i].text);  
  }  
});  

$.getJSON()- 成功回调(在我的示例中是匿名函数)传递返回的数据,该数据通常是由 JSON 结构定义并使用 $.parseJSON() 方法解析的 JavaScript 对象或数组。

于 2012-06-05T19:07:45.670 回答
2

$.getJSON 期望成功回调。这应该有效:

$.getJSON('favs.json', function (data) {
    favs = data.myTeams;

    for (i=0; i<favs.length; i++){
        alert(favs[i].text);
    }
});

您在单步执行代码时看到它工作正常的原因可能是因为您给了异步调用时间来完成。

于 2012-06-05T19:15:40.920 回答
1

$.getJSON是异步的。这意味着它在后台运行,因此在$.getJSON检索 JSON 之前调用后面的行。

您应该将所有处理 JSON 的代码放在回调中。

$.parseJSON(不需要 PS 。$.getJSON为你做)。

$.getJSON("favs.json", function(favs){
    favs = favs.myTeams;

    for (i=0; i<favs.length; i++){
        alert(favs[i].text);
    }
});
于 2012-06-05T19:12:08.643 回答
1

问题出在第一行:

var favs = $.getJSON("favs.json");

getJSON() 方法是异步的。即从服务器返回响应需要时间,并且在运行其余代码之前,javascript 不会坐下来等待。

您需要使用回调函数,该函数在响应返回后执行:

var favs = null;
$.getJSON("favs.json", function(data) {
    // data is what the server returned
    // now you can do stuff with it
    favs = data.myTeams;

    // the rest of your code goes here
})
于 2012-06-05T19:12:21.847 回答
0

对我来说,这似乎是一种竞争条件。getJson 函数采用 onSuccess 参数,该参数将在加载数据时调用。如果您将其他行移到该功能中,您应该会很好。

下面的文档链接中有一些很好的例子。我在此处发布的代码是基于您提供的此信息的更多示例显示。

http://api.jquery.com/jQuery.getJSON/

类似于以下内容:

var favs = $.getJSON("favs.json", function(data) {
    favs = $.parseJSON(data.responseText);
    favs = favs.myTeams;

    for (i=0; i<favs.length; i++){
        alert(favs[i].text);
    }
} );
于 2012-06-05T19:10:04.203 回答