0

2 つのフォーム (「テーブル」と「フィールド」) があります。「フィールド」フォームには、Ajax リクエストを行うことにより、「テーブル」で行われた選択に応じてオプションが事前設定されるはずです。データは完全に返されており、返されたデータのカットアンドペーストの例をローカル変数に渡すと、実際には2番目のフォームに事前入力されます(コメント行を参照)。しかし、何らかの理由で動作しません返されたオブジェクト?? 私はJavaScriptに非常に慣れていないため、何かアドバイスをいただければ幸いです。次のコードを使用しています。

$(document).ready(function() {
$('select#table').change(function(){
$.getJSON("/ajax_get",{id: $(this).val(), ajax: 'true'}, function(data) {
//var data = [{"optionValue":"address", "optionDisplay": "address"},{"optionValue":"latitude", "optionDisplay": "latitude"},{"optionValue":"longitude", "optionDisplay": "longitude"},];
  var $persons = $('#fields').empty();
  $.each(data, function() {
    $persons.append("<option value=" + this.optionValue + ">" + this.optionDisplay + "</option>");
  });
});
});
});
4

1 に答える 1

0

これは、すぐに理解するのに役立つ呼び出しの簡略化されたバージョンです。

$.getJSON("/ajax_get",{id: $(this).val(), ajax: 'true'}, function(data) {
  try { 
       typeof(data.somethingYouExpect);
       /* do your on success work here */
  } catch (e) {
     alert('There is a good chance the response was not JSON');
  }
});

通常の jQuery$.ajax呼び出しを使用する場合でも、返された応答が期待どおりの形式であることを確認することが重要です。successこれは、応答のような変数を true に設定するのと同じくらい簡単です。これを行うと、上記の例は次のようになります。

var jqxhr = $.getJSON("/ajax_get",{id: $(this).val(), ajax: 'true'}, function(data) {
  try { 
       typeof(data.success); // Will throw if success is not present
       if (success == true) {
             /* handle success */
       } else {
             /* handle a request that worked, but the server said no */
       }
  } catch (e) {
     /* The actual HTTP request worked, but rubbish was returned */
     alert('There is a good chance the response was not JSON');
     console.dir(jqxhr.textResponse);
  }
});

ここでは、$.getJSON呼び出しによって返されたオブジェクトを覚えています (これは への単なるショートカットです$.ajax)。これにより、サーバーから送信された実際の応答を表示できます。404、パーサーエラー、またはそのようなものであると確信しています。

ほとんどの場合、私は通常、$.ajaxほとんど個人的な好みから使用します。ここでは、エラー コールバックが xhr オブジェクトを共通関数に渡して調べます (要求は 200 を返しましたか? など)。何かが爆発した場合、コンソールを簡単に見るだけで何が問題なのかが正確にわかり、デバッグ出力を 1 か所で無効にすることができます。

于 2012-08-03T03:23:33.363 に答える