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

$ .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 に答える
2

あなたはする必要はありません

favs = $.parseJSON(favs.responseText); 

そして$.getJSON()、jsonを返さないと確信していますが、jqXHRを返します。

parseJSON()のドキュメントを見ると、おそらく次のようにする必要があります。

jQuery.getJSON( url [, データ] [, success(データ, 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 に答える
1

$.getJSON非同期です。これは、バックグラウンドで実行されることを意味するため$.getJSON、JSON が取得される前に次の行が呼び出されます。

JSON を処理するすべてのコードをコールバック内に配置する必要があります。

(PS$.parseJSONは必要ありません。 $.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 に答える