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()中,这会导致脚本终止。

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


问题 #2

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

您已经假设,如果已连接,则何时onreadystatechange触发,(xml.readyState==4 && xml.status==200)如果未连接,则相反。

但是这是错误的。

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

这些状态(将它们的值借给.readyState)列在相关 W3C 规范的第 3.5 节下:

  • UNSENT(数值 0)

    对象已构建。

  • OPENED(数值 1)

    open() 方法已成功调用。在此状态期间,可以使用 setRequestHeader() 设置请求标头,并且可以使用 send() 方法发出请求。

  • HEADERS_RECEIVED(数值 2)

    已遵循所有重定向(如果有),并且已收到最终响应的所有 HTTP 标头。该对象的几个响应成员现在可用。

  • LOADING(数值 3)

    正在接收响应实体正文。

  • DONE(数值 4)

    数据传输已完成或传输过程中出现问题(例如无限重定向)。

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

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

如果要查找此故障,请检查具有以下可能值.state的属性:

  • 如果状态为 UNSENT 或 OPENED,则返回 0 并终止这些步骤。
  • 如果错误标志为真,则返回 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当状态从to1变为2to 时,您目前看到它三次34但这不会转到else)。

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

 if(res == "0")

==是相等运算符。和,

res = xml.responseText;

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

于 2011-08-20T18:23:55.527 回答