JavaScript. Подробное руководство, 6-е издание, стр. 290

<b>event: bid   установка свойства type объекта события </b>

<b>data:  G00G  установка свойства data</b>

<b>data:  999   добавляется перевод строки и дополнительные данные</b>

<b>             пустая строка генерирует событие message</b>

Протокол имеет также некоторые дополнительные особенности, позволяющие присваивать событиям идентификаторы и дающие клиенту возможность после восстановления соединения с сервером передавать этот идентификатор, чтобы сервер мог повторно послать все события, пропущенные клиентом. Однако эти особенности не имеют большого значения в данном обсуждении.

Одно из очевидных применений архитектуры Comet - реализация чатов: клиент может посылать в чат новые сообщения с помощью объекта

<b>XMLHttpRequest</b>
и подписываться на поток сообщений, поступающих от собеседников, с помощью объекта
<b>EventSource</b>
. Пример 18.15 демонстрирует, насколько просто реализовать клиента на основе объекта
<b>EventSource</b>
.

Пример 18.15. Простой клиент чата на основе объекта

<b>EventSource</b>

<b>&lt;script&gt;</b>

<b>window.onload = function() {</b>

<b>  // Позаботиться о некоторых особенностях пользовательского интерфейса</b>

<b>  var nick = prompt(&quot;Введите ваше имя&quot;); // Получить имя пользователя</b>

<b>  var input = document.getElementById(&quot;input&quot;); // Отыскать поле ввода</b>

<b>  input.focus(); // Передать фокус ввода</b>

<b>  // Подписаться на получение новых сообщений с помощью объекта EventSource</b>

<b>  var chat = new EventSource(&quot;/chat&quot;);</b>

<b>  chat.onmessage = function(event) {         // Получив новое сообщение,</b>

<b>    var msg = event.data;                    // Извлечь текст</b>

<b>    var node = document.createTextNode(msg); // Преобр. в текстовый узел</b>

<b>    var div = document.createElementC'div&quot;); // Создать &lt;div&gt;</b>

<b>    div.appendChild(node);                   // Добавить текст, узел в div</b>

<b>    document.body.insertBefore(div, input);  // И добавить div перед input</b>

<b>    input.scrollIntoView();                  // Прокрутить до появления</b>

<b>  }                                          // input в видимой области</b>

<b>  // Передавать сообщения пользователя на сервер с помощью XMLHttpRequest</b>

<b>  input.onchange = function() { // При нажатии клавиши Enter</b>

<b>    var msg = nick + &quot;: &quot; + input.value; // Имя пользователя + введ. текст</b>

<b>    var xhr = new XMLHttpRequest();      // Создать новый XHR</b>

<b>    xhr.open(&quot;POST&quot;, &quot;/chat&quot;);           // POST-запрос к /chat,</b>

<b>    xhr.setRequestHeader(&quot;Content-Type&quot;, // Тип - простой текст UTF-8</b>

<b>                      &quot;text/plain;charset=UTF-8&quot;);</b>

<b>    xhr.send(msg);                       // Отправить сообщение</b>

<b>    input.value = &quot;&quot;;                    // Приготовиться к вводу</b>

<b>  }                                      // следующего сообщения</b>

<b>};</b>

<b>&lt;/script&gt;</b>

<b>&lt;!-- Пользовательский интерфейс чата состоит из единственного поля ввода --&gt;</b>

<b>&lt;!-- Новые сообщения, отправленные в чат, вставляются перед полем ввода --&gt;</b>

<b>&lt;input id=&quot;input&quot; style=&quot;width:100%&quot;/&gt;</b>

На момент написания этих строк объект

EventSource
поддерживался в Chrome и Safari и должен был быть реализован компанией Mozilla в первом же выпуске Firefox, вышедшем после версии 4.0. В броузерах (таких как Firefox), где реализация объекта
<b>XMLHttpRequest</b>
возбуждает событие «readystatechange» в ходе загрузки ответа (для значения 3 в свойстве
<b>readyState</b>
) многократно, поведение объекта
<b>EventSource</b>
относительно легко имитировать с помощью объекта
<b>XMLHttpRequest</b>
, как демонстрируется в примере 18.16. С модулем имитации пример 18.15 будет работать в Chrome, Safari и Firefox. (Пример 18.16 не будет работать в броузерах ІE и Opera, поскольку реализации объекта
<b>XMLHttpRequest</b>
в этих броузерах не генерируют события в ходе загрузки.)

Пример 18.16. Имитация объекта

<b>EventSource</b>
с помощью
<b>XMLHttpRequest</b>

<b>// Имитация прикладного интерфейса EventSource в броузерах, не поддерживающих его.</b>

<b>// Требует, чтобы XMLHttpRequest генерировал многократные события readystatechange </b>

<b>// в ходе загрузки данных из долгоживущих HTTP-соединений. Учтите, что это не полноценная </b>

<b>// реализация API: она не поддерживает свойство readyState, метод close(), а также </b>

<b>// события open и error. Кроме того, регистрация обработчика события message выполняется </b>

<b>// только через свойство onmessage -- эта версия не определяет метод addEventListener</b>