0

以下のコードで簡単なクリック機能がありますが、最初のクリックでデータを取得できないようです。

 $.ajax({
  type: 'POST',
  url: 'test/get/1',
  success: function (result) { testit = result; },
  dataType: 'json',
  data: 'js=1'
 });
 alert(testit);

私のコールバック関数では、単に return drupal_json('hello'); を持っています。しかし、2回目まで表示されません。たとえば、ボタンをクリックしても何も起こりませんが、もう一度クリックすると「こんにちは」という警告が表示されます。動的なデータがある場合は、それも 1 クリック遅れます。たとえば、1 回目のクリックでアラート 1、2 回目のクリックでアラート 2 などとします。代わりに、最初のクリックは何もせず、2 回目のクリックはアラート 1、3 回目のクリックはアラート 2 などです。ありがとう。

4

2 に答える 2

0

ainはajax非同期を表します。したがって、関数が呼び出されるまで (ajax 呼び出しが正常に完了した場合) testit、ajax の応答の結果に設定されません。success:

$.ajax({
  type: 'POST',
  url: 'test/get/1',
  success: function (result) { testit = result; alert(testit); },
  dataType: 'json',
  data: 'js=1'
});

同期的に動作させたい場合は、次のようaysnc:falseに jQuery の.ajaxオプションで設定することもできます。

var testit = $.ajax({
  type: 'POST',
  async: false,
  url: 'test/get/1',
  dataType: 'json',
  data: 'js=1'
}).responseText;

alert(testit);

2 番目の方法では、ajax 呼び出しが完了するまで、すべての JavaScript が遅延されます (通常は著しく遅い)。success:最初の例のコールバックでコードを実行することをお勧めします。ただし、error:何かが失敗した場合に備えて、コールバックを作成することもできます (そうしないと、成功しなかったためにコールバックが呼び出されない可能性があります)。

于 2010-01-19T01:12:02.333 に答える
0

これは、AJAX 要求がスクリプトをブロックしないために発生している可能性があります。先に進み、リクエストを行いますが、次の行 (アラート) を実行する前に結果が返されるのを待ちません。したがって、最初にアラートにヒットしたときはデータがフェッチされず、2 回目は最初のリクエストのデータしかない (2 番目のリクエストは開始されたが終了していない) などです。

解決策は、応答が受信されるまで実行されないコールバック関数にアラートを配置することです。

$.ajax({
  type: 'POST',
  url: 'test/get/1',
  success: function (result) { alert(result); },
  dataType: 'json',
  data: 'js=1'
 });
于 2010-01-19T01:12:26.797 に答える