1

私はAJAXを実践しています。サーバー内のファイルからテキストを取得するコードを記述し、それが「0」の場合は「ゼロ」を出力し、エラーの場合は「接続されていません」を出力します。しかし、何かがうまくいかなかったのですが、接続されていても接続されないだけなのかわかりません。

コードは次のとおりです。

<html>
<head>
<title>LogIN</title>
<script>
function verify()
            {           
            var xml;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xml=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xml=new ActiveXObject("Microsoft.XMLHTTP");
  }
   xml.onreadystatechange=function()
       {
       if (xml.readyState==4 && xml.status==200)
        {
            var res=xml.responseText();
            if(res.equals("0"))
            {
                document.write("zero");
            }
            else
            {
            document.write("one");
            }
        }
        else
            document.write("Not connected");
        }
  xml.open("GET", "log_verify.txt", true);
  xml.send();
}
function login()
{
//action to login
}
</script>
</head>
<body>
<form>
User name : <input type="text" name="uname" onblur="verify()">
<br>
Pwd    : <input type="password" name="passwd" >
<br>
<input type="button" name="Login" value="Login" onclick="login()">
</form>
</body>
</html>

出力を次のように取得する

接続されていません接続されていません接続されていません

しかし、応答テキストを表示するだけで、以下のコードに従って正しく印刷されます

<html>
<head>
<title>LogIN</title>
<script>
function verify()
            {           
            var xml;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xml=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xml=new ActiveXObject("Microsoft.XMLHTTP");
  }
   xml.onreadystatechange=function()
  {
  if (xml.readyState==4 && xml.status==200)
    {
       document.getElementById("myDiv").innerHTML+=xml.responseText;
    }
  } 
  xml.open("GET", "log_verify.txt", true);
  xml.send();
}
function login()
{
//action to login
}
</script>
</head>
<body>
<form>
User name : <input type="text" name="uname" onblur="verify()">
<br>
Pwd    : <input type="password" name="passwd" >
<br>
<input type="button" name="Login" value="Login" onclick="login()">
</form>
<div id="myDiv"><h2>Response text:</h2></div>
</body>
</html>

出力を次のように取得する

応答テキスト:

0

javascriptコーディングまたはサーバー応答のどこかに問題がありますか?

4

2 に答える 2

3

問題#1

あなたが書いた最初のスニペットxml.responseText()では、スクリプトが終了します。

2番目のスニペットでは、それを正しく理解し、と書いていxml.responseTextます。これはテキストプロパティであり、関数ではありません。


問題#2

「未接続」のメッセージについては問題ありません。

あなたは、onreadystatechange発砲されたとき、(xml.readyState==4 && xml.status==200)接続されている場合はその逆であり、接続されていない場合はその逆であると仮定しました。

しかし、これは真実ではありません。

XMLHttpRequestの存続期間中、接続が成功すると、onreadystatechange複数回起動し、リクエストの進行に合わせてオブジェクトのさまざまな状態を追跡します。

これらの状態(値をに貸す)は、関連するW3C仕様のセクション3.5に.readyStateリストされています。

  • UNSENT(数値0)

    オブジェクトが作成されました。

  • OPENED(数値1)

    open()メソッドが正常に呼び出されました。この状態の間、リクエストヘッダーはsetRequestHeader()を使用して設定でき、リクエストはsend()メソッドを使用して作成できます。

  • HEADERS_RECEIVED(数値2)

    すべてのリダイレクト(存在する場合)が実行され、最終応答のすべてのHTTPヘッダーが受信されました。オブジェクトのいくつかの応答メンバーが使用可能になりました。

  • LOADING(数値3)

    応答エンティティ本体が受信されています。

  • DONE(数値4)

    データ転送が完了したか、転送中に問題が発生しました(無限リダイレクトなど)。

条件を使用してコードを実行するのは、オブジェクトが状態に入ったときだけDONEであり、他の状態が失敗を示しているためではありません。

DONE状態には、ある種のネットワークエラーまたは異常終了を示すエラーフラグが関連付けられています。これはtrueまたはfalseのいずれかであり、初期値はfalseです。

この失敗を探したい場合は、次の可能な値を持つ.stateプロパティを確認してください。

  • 状態がUNSENTまたはOPENEDの場合は、0を返し、これらのステップを終了します。
  • エラーフラグがtrueの場合は、0を返し、これらの手順を終了します。
  • HTTPステータスコードを返します。

それで:

xml.onreadystatechange = function() {
   if (xml.readyState != 4) { // handle DONE only
      return;
   }

   if (xml.status == 0) { // error
      document.getElementById("myDiv").innerHTML += "Connection error"
   }
   else if (xml.status == 200) { // HTTP 200 OK
      document.getElementById("myDiv").innerHTML += xml.responseText;
   }
   else { // some other HTTP code
      document.getElementById("myDiv").innerHTML += "HTTP response code " + xml.status;
   }
}
于 2011-08-20T18:24:19.497 に答える
1

初め、

    else
        document.write("Not connected");

状態が変化するたびに実行され、ステータスはそうでは4ありません200。必ずしも意味するわけではありませんNot connected。その部分を削除するだけで済みます。現在、ステータスがから0に変わるときに3回表示12れます34ただし、はになりませんelse)。

次に、を使用していますが.equals、この関数はネイティブに使用できず、定義もされていません。何方をお探しですか:

 if(res == "0")

==等式演算子です。と、

res = xml.responseText;

これは関数ではないため、を追加しないでください()

于 2011-08-20T18:23:55.527 に答える