2

変数「出力」はその値を保持していません

function send()
{
var output;
var xmlhttp;
if (window.XMLHttpRequest)
  {
  xmlhttp=new XMLHttpRequest();
  }
else
  {
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    output = xmlhttp.responseText;

この出力は「hello world」を表示します

alert(output);
    }
  }
xmlhttp.open("GET",'mp.php',true);
xmlhttp.send();

この出力には「未定義」が表示されます。

alert(output);
return output
}

ブラウザでナビゲートすると、mp.php のコンテンツに「Hello world」と表示される

出力変数を返すときに「未定義」にしないようにするにはどうすればよいですか?

4

3 に答える 3

2

JavaScript は非同期です。

あなたのコードで起こっていることは

  1. 設定XMLHttpRequest
  2. 印刷Output\\ 未定義
  3. 非同期呼び出しが成功しました
  4. Output\\ "Hello World" を出力

これを修正するには、成功メソッドで、出力を出力する新しいメソッドを呼び出します

于 2013-11-12T03:40:18.583 に答える
2

Ajax 呼び出しは非同期です。コードの流れは次のようになります。

xmlhttp.send(); // async, so program flow will continue
alert(output); // this happened BEFORE the ajax call returned, so it is undefined here.

より良いアプローチは、ajax 呼び出しが完了したときにコールバックを使用することです。コールバックは、ajax 呼び出しから返された値に対して必要なことは何でも実行できます。

関連する注意事項として、jquery を使用する方が簡単であることがわかる場合があります。次のように単純化できます

$.get('myurl',{
  success: function(res) { // do success function }
});
于 2013-11-12T03:40:56.660 に答える
0

リターンはありません。デリゲート (.onreadystatechange=function()) は関数 (send()) を使い果たします。3 つの方法があります。a) グローバル変数の出力を定義して使用する。b) xttpRequest を同期的に実行します (イベントとイベント処理なしで)。c) コードの構造を変更して、成功イベントを処理します。

于 2013-11-12T03:43:34.480 に答える