Сравнение текста ответа - PullRequest
1 голос
/ 20 августа 2011

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

3 голосов
/ 20 августа 2011

Задача # 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;
   }
}
1 голос
/ 20 августа 2011

Во-первых,

    else
        document.write("Not connected");

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

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

 if(res == "0")

== - оператор равенства. И,

res = xml.responseText;

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

...