【问题标题】:Response text comparision响应文本比较
【发布时间】:2011-08-21 02:44:47
【问题描述】:

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

【问题讨论】:

    标签: javascript ajax xmlhttprequest xmlhttprequest-states


    【解决方案1】:

    问题 #1

    在第一个 sn-p 中你写了xml.responseText(),这会导致脚本终止。

    在第二个 sn-p 中你没看错,写了xml.responseText。它是一个文本属性,而不是一个函数。


    问题 #2

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

    您假设,当onreadystatechange 被触发时,(xml.readyState==4 &amp;&amp; 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 状态有一个相关的错误标志,指示某种类型的网络错误或中止。可以是真也可以是假,初始值为假。

    如果要查找此故障,请检查.state 属性,which has the following possible values

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

    【讨论】:

    • 但是这两个代码都有相同的条件但第二个有效而第一个无效,为什么??
    • @vivek:因为一开始你写的是xml.responseText()而不是xml.responseText
    • 顺便说一句,这里的“代码”是一个不可数名词;因此“这两个代码”是不正确的。 “那两段代码”会更好。
    • 谢谢你,解决了,非常有帮助!尤其是“不可数名词”:-p,,谢谢指教!!
    【解决方案2】:

    首先,

        else
            document.write("Not connected");
    

    只要状态改变并且状态不是4200 就会执行。它不一定意味着Not connected。您可以删除该部分。当状态从 0123 (和 4 但这不会转到 else)时,您目前看到它三次。

    其次,您使用的是.equals,但此函数本身不可用,您也没有定义它。您在寻找:

     if(res == "0")
    

    == 是相等运算符。而且,

    res = xml.responseText;
    

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

    【讨论】:

    • 如果最后一个状态没有通过其他部分意味着它应该打印“零”或“一”,但这也没有发生..我也尝试过 == 但这也给出了同样的反应.. 喜欢.. if(res == "0")
    • @vivek_jonam:你调用responseText() 好像它是一个函数但它是一个属性。
    • 但在第二个代码中以相同的方式调用 responseText() 效果很好,为什么以及如何??
    • @vivek:不,它没有。在第二段代码中,您将其正确检索为responseText这里没有()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多