0

[3000,2500,6000,2200,5000,1300] という単純な json ファイルから読み込もうとしています。data.txt として保存されます。私のコードでは、最初のステップとして空の配列を作成します。次に、data.txt ファイルの内容を読み取る $.getJSON 関数に関数を渡します。次に、JSON 配列のすべての項目を読み取り、前に作成した空の配列にプッシュします。配列の最初の要素 arr[0] を出力しようとすると、未定義になります。document.write(arr[0]); を配置すると 最後のブラケットの前の式で、正しい答え 3000 が得られますが、外側にある必要があります。なぜこうなった?

arr=[];

$.getJSON('data.txt',function(data) {

for (var i in data){  
arr.push(data[i]);  
}

}); 

document.write(arr[0]);
4

2 に答える 2

0

getJSONは、他の AJAX リクエストと同様に非同期です。取得したデータに依存するものはすべて、成功のコールバック内 (または、コールバックによって呼び出される関数内) に配置する必要があります。

document.write()その結果、ドキュメントが既に読み込まれているため、使用できなくなります。

代わりに、テキストノードに入れて本文に追加するなど、ドキュメントに適切にarr.push(data[i])追加するためのコードに置き換えます。data[i]

var x = new XMLHttpRequest();
x.open("GET","data.txt",true);
x.onreadystatechange = function() {
  if( this.readyState == 4 && this.status == 200) {
    var r = window.JSON ? JSON.parse(this.responseText) : eval("("+this.responseText+")"),
      node, i;
    for( i in data) {
      node = document.createTextNode(data[i]);
      document.body.appendChild(node);
    }
  }
};
x.send();
于 2013-02-21T04:57:57.180 に答える
0
  1. for...in構文で配列を反復処理しないでください。これは、オブジェクトのプロパティを反復処理するための構文ですが、これはあなたが望むものではありません。

    forループを使用するだけです:

    for (var i = 0; i < data.length; i++) {
    
    }
    
  2. AJAX は非同期であるため、が呼び出さarrれた後に定義されます。document.write()値を操作する場合は、getJSONコールバック内から実行します。

于 2013-02-21T04:59:13.207 に答える