Сравнение текста ответа

Я практикую 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 ответа

Решение

Первый,

    else
        document.write("Not connected");

выполняется всякий раз, когда состояние изменяется, а статусы не 4 а также 200, Это не обязательно означает Not connected, Вы можете просто удалить эту часть. В настоящее время вы видите это три раза, когда статус меняется с 0 в 1 в 2 в 3 (а также 4 но это не идет к else).

Во-вторых, вы используете .equals но эта функция не доступна изначально, и вы также не определили ее. Вы ищете:

 if(res == "0")

== является оператором равенства. А также,

res = xml.responseText;

это не функция, поэтому вы не должны добавлять (),

Проблема № 1

В первом фрагменте вы написали xml.responseText(), что приводит к завершению сценария.

Во втором фрагменте вы все правильно поняли и написали xml.responseText, Это свойство текста, а не функция.


Проблема № 2

Что касается сообщений "Не подключен", проблем нет.

Вы предполагали, что когда onreadystatechange уволен, (xml.readyState==4 && xml.status==200) если подключен и наоборот если не подключен.

Но это не так.

В течение времени жизни XMLHttpRequest, если соединение успешно, onreadystatechange срабатывает несколько раз, отслеживая различные состояния объекта по мере выполнения запроса.

Эти состояния (которые предоставляют свои значения .readyState) перечислены в разделе 3.5 соответствующей спецификации W3C:

  • UNSENT (числовое значение 0)

    Объект был построен.

  • OPENED (числовое значение 1)

    Метод open() был успешно вызван. Во время этого состояния заголовки запроса могут быть установлены с помощью setRequestHeader(), а запрос может быть выполнен с помощью метода send().

  • HEADERS_RECEIVED (числовое значение 2)

    Все перенаправления (если таковые имеются) были соблюдены, и все заголовки HTTP окончательного ответа были получены. Несколько ответных членов объекта теперь доступны.

  • LOADING (числовое значение 3)

    Тело объекта ответа принимается.

  • DONE (числовое значение 4)

    Передача данных была завершена или что-то пошло не так во время передачи (например, бесконечные перенаправления).

Вы используете условный код для выполнения своего кода только тогда, когда объект входит в DONE состояние, а не потому, что любое другое состояние указывает на сбой.

Состояние DONE имеет связанный флаг ошибки, который указывает на какой-либо тип сетевой ошибки или прерывания. Это может быть либо истина или ложь и имеет начальное значение ложь.

Если вы хотите найти этот сбой, проверьте .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;
   }
}
Другие вопросы по тегам