Почему IE не отображает это предупреждение ()? - PullRequest
2 голосов
/ 16 марта 2010

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

// 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 его подавляет, выпуская "Unspecified error". и он указывает на строку с предупреждением () в нем. Почему не отображается предупреждение?

Редактировать: Хорошо, после закрытия диалогового окна с ошибкой я получаю три оповещения, как и ожидалось ...

Редактировать: Теперь это действительно странно. Если я изменю

alert('pageRequest.readyState: ' + pageRequest.readyState
        + '\npageRequest.status: ' + pageRequest.status);

до

alert('pageRequest.readyState: ' + pageRequest.readyState);

тогда это работает, и я получаю 5 предупреждений. (1,1,2,3,4)

Ответы [ 3 ]

1 голос
/ 16 марта 2010

Chrome 4 также вызывает ошибку (INVALID_STATE_ERR: DOM Exception 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. Если состояние UNSENT или OPENED, вернуть 0 и завершить эти шаги.
  2. Если флаг ошибки равен true, вернуть 0 и завершить эти шаги.
  3. Вернуть код состояния HTTP.
1 голос
/ 16 марта 2010

Состояние - это HTTP-ответ, первые два раза при вызове метода вы получаете 1 и 1 в качестве ReadyState. readyState 1 означает "Объект был создан, но метод отправки не был вызван." . В то время от сервера не было ответа о состоянии, так как он не получил никаких запросов, поэтому использование статуса в вашем предупреждении выдало ошибку.

0 голосов
/ 16 марта 2010

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

status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...