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><b>EventSource</b>Пример 18.15. Простой клиент чата на основе объекта <b>EventSource</b>
<b><script></b><b>window.onload = function() {</b><b> // Позаботиться о некоторых особенностях пользовательского интерфейса</b><b> var nick = prompt("Введите ваше имя"); // Получить имя пользователя</b><b> var input = document.getElementById("input"); // Отыскать поле ввода</b><b> input.focus(); // Передать фокус ввода</b><b> // Подписаться на получение новых сообщений с помощью объекта EventSource</b><b> var chat = new EventSource("/chat");</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"); // Создать <div></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 + ": " + input.value; // Имя пользователя + введ. текст</b><b> var xhr = new XMLHttpRequest(); // Создать новый XHR</b><b> xhr.open("POST", "/chat"); // POST-запрос к /chat,</b><b> xhr.setRequestHeader("Content-Type", // Тип - простой текст UTF-8</b><b> "text/plain;charset=UTF-8");</b><b> xhr.send(msg); // Отправить сообщение</b><b> input.value = ""; // Приготовиться к вводу</b><b> } // следующего сообщения</b><b>};</b><b></script></b><b><!-- Пользовательский интерфейс чата состоит из единственного поля ввода --></b><b><!-- Новые сообщения, отправленные в чат, вставляются перед полем ввода --></b><b><input id="input" style="width:100%"/></b>На момент написания этих строк объект
EventSource<b>XMLHttpRequest</b><b>readyState</b><b>EventSource</b><b>XMLHttpRequest</b><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>