XMLHTTPRequest, состояние interactive

Официально у объекта XMLHTTPRequest есть состояние readyState=3, interactive, при котором ответ находится в процессе загрузки, и уже полученная часть может быть прочитана в responseText.

В ряде браузеров это действительно работает, и состояние interactive можно использовать для передачи сообщений с сервера.

Кнопка ниже запускает XMLHTTPRequest, на который сервер отвечает по 1 цифре в секунду.

Возможно, результат будет выводится большими блоками по много сообщений сразу - дальше мы обсудим, почему.

Тут будут сообщения

На самом деле readyState браузеры поддерживают всяк в свою степь, и результаты могут быть различные. На момент написания, "как надо" работало только в Firefox, более-менее работало в Opera/Safari, в IE 6-7 не работает вообще.

Можно использовать состояние interactive для server push: каждое событие interactive знаменует приход новой порции данных.

Тут будут сообщения

(Если Вы нажали на обе кнопки, то сообщения обоих запросов будут вываливаться в один div)

Функция обработки будет такой:

var last_char = 0
req.onreadystatechange = function() {
  if (req.readyState == 3) {
    // выцепить из ответа сервера следующий кусок
    var message = req.responseText.substr(last_char)
    last_char = req.responseText.length
  }
  ...
}
  • минимальная задержка и трафик
  • нет индикации загрузки
  • данные нельзя сжимать
  • проблемы с кросс-браузерностью, надежностью.