Задача # 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;
}
}