响应文本比较

时间:2011-08-20 18:18:59

标签: javascript ajax xmlhttprequest xmlhttprequest-states

我正在练习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编码中的问题还是服务器响应中的某个问题?

2 个答案:

答案 0 :(得分:3)

问题#1

在您编写xml.responseText()的第一个片段中,导致脚本终止。

在第二个片段中,你做对了,写了xml.responseText。这是一个文本属性,而不是函数。


问题#2

关于“未连接”消息,没有问题。

你假设,当onreadystatechange被解雇时,(xml.readyState==4 && xml.status==200)如果连接,则相反,如果没有连接。

但事实并非如此。

在XMLHttpRequest的生命周期中,如果连接成功,onreadystatechange会多次触发,在请求进行时跟踪对象的各种状态。

这些状态(将其值提供给.readyState)列在section 3.5 of the relevant W3C spec下:

  
      
  • UNSENT(数值0)

         

    该物体已经建成。

  •   
  • OPENED(数值1)

         

    已成功调用open()方法。在这种状态下   可以使用setRequestHeader()和请求设置请求标头   可以使用send()方法进行。

  •   
  • HEADERS_RECEIVED(数值2)

         

    已遵循所有重定向(如果有)以及所有HTTP标头   已收到最终答复。几位回应成员   对象现在可用。

  •   
  • LOADING(数值3)

         

    正在接收回复实体。

  •   
  • DONE(数值4)

         

    数据传输已完成或出现问题   转移期间(例如无限重定向)。

  •   

当对象进入DONE状态时,您使用条件仅执行代码 ,而不是因为任何其他状态指示失败。

  

DONE状态有一个相关的错误标志,指示某种类型的网络错误或堕胎。它可以是true或false,初始值为false。

如果您想查找此失败,请查看.state媒体资源which has the following possible values

  
      
  • 如果状态为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;
   }
}

答案 1 :(得分:1)

首先,

    else
        document.write("Not connected");
只要状态发生变化且状态不是4200,就会执行

。它并不一定意味着Not connected。你可以删除那部分。当状态从0更改为12再到3(以及4时,您目前看到它三次,但这不会转到else)。

其次,您正在使用.equals,但此功能本身不可用,您也没有定义它。你在寻找:

 if(res == "0")

==是相等运算符。和,

res = xml.responseText;

它不是一个函数,所以你不应该追加()