Почему IE не отображает это оповещение ()?
-
20-09-2019 - |
Вопрос
У меня есть следующий фрагмент кода:
// setup the AJAX request
var pageRequest = false;
if(window.XMLHttpRequest) pageRequest = new XMLHttpRequest();
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP");
// callback
pageRequest.onreadystatechange = function() {
alert('pageRequest.readyState: ' + pageRequest.readyState
+ '\npageRequest.status: ' + pageRequest.status);
}
pageRequest.open('POST','ajax.php',true);
// q_str contains something like 'data=value...'
pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
pageRequest.setRequestHeader("Content-length", q_str.length);
pageRequest.setRequestHeader("Connection", "close");
pageRequest.send(q_str);
Это прекрасно работает в Chrome, но IE захлебывается этим, выплевывая "неуказанную ошибку". и это указывает на строку с alert() в ней.Почему он не может отобразить оповещение?
Редактировать:Хорошо, после того, как я закрываю диалоговое окно с ошибкой, я получаю три предупреждения, как и ожидалось....
Редактировать:Теперь это действительно становится странным.Если я изменюсь
alert('pageRequest.readyState: ' + pageRequest.readyState
+ '\npageRequest.status: ' + pageRequest.status);
Для
alert('pageRequest.readyState: ' + pageRequest.readyState);
затем это работает, и я получаю 5 предупреждений.(1,1,2,3,4)
Решение
Status - это HTTP-ответ, при первых двух вызовах метода вы получаете обратно 1 и 1 в качестве readyState.Состояние готовности 1 означает "Объект был создан, но метод отправки не был вызван"..В это время от сервера нет ответа о статусе, поскольку он не получал никаких запросов, поэтому использование статуса в вашем предупреждении выдало вам ошибку.
Другие советы
Chrome 4 также выдает ошибку (INVALID_STATE_ERR:Исключение DOM 11).Вы увидите сообщение об ошибке, если откроете консоль Chrome Javascript.
Firefox 3.6 также выдает ошибку, но, похоже, беззвучно удаляет ее (она не видна в консоли ошибок).Если вы обернете функцию в try..catch
заблокируйте, вы увидите сообщение об ошибке (Компонент вернул код ошибки:0x80040111 (NS_ERROR_NOT_AVAILABLE)):
pageRequest.onreadystatechange = function() {
try {
alert('pageRequest.readyState: ' + pageRequest.readyState
+ '\npageRequest.status: ' + pageRequest.status);
}
catch (e) {
alert(e);
}
}
Первые два раза onreadystatechange
вызывается в Internet Explorer, readyState
равен 1 (ОТКРЫТ).В этом состоянии запрос отправляется, но ответ еще не получен.Ошибка возникает при вызове status
собственность в этом readyState
потому что нет HTTP-ответа для считывания статуса.
Такое поведение совместимо со старыми версиями Спецификация W3C XMLHttpRequest, в каком состоянии:
Если
status
атрибут недоступен он ДОЛЖЕН вызвать исключение.Он ДОЛЖЕН быть доступен, когдаreadyState
является 3 (принимающим) или 4 (загруженным).Когда доступно, оно ДОЛЖНО представлять код состояния HTTP (обычно 200 для успешного подключения).Исключения при извлечении
Исключение DOMException
INVALID_STATE_ERR
ДОЛЖЕН быть поднят при обращении к этому атрибуту когда readyState имеет неподходящее значение.
Более новые версии в спецификации, однако, указано, что status
всегда должен возвращать значение:
Тот самый
status
атрибут должен возвращать результат выполнения этих шагов:
- Если состояние НЕОТПРАВЛЕНО или ОТКРЫТО, верните 0 и завершите выполнение этих шагов.
- Если флаг ошибки равен true, верните 0 и завершите выполнение этих шагов.
- Верните код состояния HTTP.
Я думаю, у вас возникла проблема с конкатенацией строк при оценке PageRequest.status (который является целым числом).Просто попробуй это:
status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);