13

プロパティ値にアクセスできるように、URL のファイル (myData.json) からオブジェクトに json をロードするのに苦労しています。

-- データはすぐに読み込まれます。アプリで必要なデータがたくさんあります。

-- データが読み込まれた直後に発生する 1 つの関数の一部としてではなく、アプリ全体でデータにアクセスします。

-- ファイル内のデータが適切にフォーマットされた json であることを確認しました。

jquery API の例に従って、次のような単純なことを行うことはできません。

アラート (jqxhr.myProperty);

値を取得しますか?ここで欠けているステップは何ですか? 私はevalを実行してみましたが、次のようなさまざまなことを試しました

var myObj=JSON.parse(jqxhr);

無駄に。

お願いします....ありがとうございます。

// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
var jqxhr = $.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });

// perform other work here ...

// Set another completion function for the request above
jqxhr.complete(function(){ alert("second complete"); });
4

3 に答える 3

13

あなたはそれを複雑にしすぎていると思います:)

 var JSON;

 $.getJSON('example.json', function(response){
       JSON = response;
       alert(JSON.property);
 })
 //feel free to use chained handlers, or even make custom events out of them!
 .success(function() { alert("second success"); })
 .error(function() { alert("error"); })
 .complete(function() { alert("complete"); });

getJSON 関数は、応答を適切な JSON オブジェクトに自動的に変換します。解析する必要はありません。

このデータをいたるところで使用していると述べたので、データにアクセスできるようになる前に ajax 呼び出しが完了するまで待つ必要があります。これは、アプリケーション全体をgetJSONコールバックでラップすることを意味します。または、カスタム イベントを使用して次のように決定します。

 var JSON;

 $(window).on('JSONready', function(){
       alert(JSON.property);
 });

 $.getJSON('example.json', function(response){
       JSON = response;
       $(window).trigger('JSONready');
 });

 $('#elem').on('click', function(){
       //event likely to take place after ajax call has transpired
       //it would still be better to assign this listener in a callback, 
       //but you can get away with not doing it, if you put in a catch
       if(JSON){
           alert(JSON.property);
       }          
 });

編集

簡単なライブ デバッグの後、データが利用できない本当の理由は次のとおりです。JSON を使用する JavaScript が、呼び出しを実行するインライン JavaScript のページ ドキュメント NORTH を含むファイルにありました。その結果、JSON はグローバル変数ではなく、スコープによってその使用が妨げられました。変数をグローバルにする必要がある場合は、インライン JS および含まれるすべての js ファイルで使用できるようにするには、次のようにします。

  (function(){
      var limitedScopeVariable = 25;
      window.globalScopeVariable = 30;
  })();

  $(function(){
       alert(globalScopeVariable); //works!
       alert(limitedScopeVariable); //fails!
  });

編集2

jQuery 3.0 では、コールバック関数が異なります。jqXHR.success()、jqXHR.error()、および jqXHR.complete() コールバック メソッドは、jQuery 3.0 で削除されました。代わりに jqXHR.done()、jqXHR.fail()、および jqXHR.always() を使用できます

コメントから @mario-lurig

于 2012-06-12T22:30:44.237 に答える
3

json データは $.getJSON のコールバック関数に渡されます。したがって、これは機能します:

var jqxhr;

$.getJSON("example.json", function(data) {
  jqxhr = data;
});

// alert(jqxhr.property);
// caution: this won't work immediately on load, since the ajax call runs asynchronously and hasn't finished at that time

// it should be available at a later time, like a click event
$('a#something').click(function(){
     if(jqxhr){
          alert(jqxhr.property);
     }else{
          alert('getJSON not yet complete or failed');
     }
});
于 2012-06-12T22:33:31.367 に答える
0

これはあなたが探しているものだと思います。呼び出し元オブジェクト自体ではなく、呼び出しから返されたデータにアクセスしようとしています。あなたの例では、jqxhr はデータではなく JSON 呼び出しを処理するオブジェクトです。そう、

$.getJSON("example.json", function(data) {
  yourDATA = data;
})

//Use your data here
alert(yourDATA.aProperty);

このページの最初の例は、私が説明したものと似ています。

于 2012-06-12T22:33:37.057 に答える