Вопрос

У меня есть следующий фрагмент кода:

// 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 атрибут должен возвращать результат выполнения этих шагов:

  1. Если состояние НЕОТПРАВЛЕНО или ОТКРЫТО, верните 0 и завершите выполнение этих шагов.
  2. Если флаг ошибки равен true, верните 0 и завершите выполнение этих шагов.
  3. Верните код состояния HTTP.

Я думаю, у вас возникла проблема с конкатенацией строк при оценке PageRequest.status (который является целым числом).Просто попробуй это:

status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top