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