Spec-Zone.ru › Web APIs

EventSource

Базовая Широко доступна *

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с января 2020 года.

* Некоторые части этой функции могут иметь различный уровень поддержки.

  • Подробнее
  • Полная совместимость
  • Отправить отзыв

Примечание: Эта функция доступна в Web Workers.

Интерфейс EventSource — это интерфейс веб-контента для событий, отправляемых сервером.

Экземпляр EventSource открывает постоянное соединение с сервером HTTP, который отправляет события в формате text/event-stream. Соединение остается открытым до тех пор, пока его не закроют, вызвав EventSource.close().

EventTarget EventSource

После открытия соединения входящие сообщения с сервера доставляются вашему коду в виде событий. Если в входящем сообщении есть поле event, то сгенерированное событие совпадает со значением поля event. Если поле event отсутствует, то генерируется общее событие message.

В отличие от WebSockets, события, отправляемые сервером, являются однонаправленными; то есть, данные передаются в одном направлении, от сервера к клиенту (например, веб-браузеру пользователя). Это делает их отличным выбором, когда нет необходимости отправлять данные от клиента к серверу в виде сообщений. Например, EventSource — полезный подход для обработки таких вещей, как обновления статуса в социальных сетях, ленты новостей или доставка данных в механизм хранения на стороне клиента, такой как IndexedDB или хранилище веб-данных.

Предупреждение: Когда не используется HTTP/2, SSE ограничен максимальным количеством открытых соединений, что может быть особенно проблематично при открытии различных вкладок, так как ограничение устанавливается на браузер и имеет очень низкое значение (6). Проблема отмечена как «не будет исправлена» в Chrome и Firefox. Это ограничение относится к каждому браузеру + домену, поэтому это означает, что вы можете открыть 6 соединений SSE для всех вкладок на www.example1.com и еще 6 соединений SSE для www.example2.com. (из Stack Overflow). При использовании HTTP/2 максимальное количество одновременных HTTP-потоков согласовывается между сервером и клиентом (по умолчанию 100).

Конструктор

EventSource()

Создает новый EventSource для обработки приема событий, отправляемых сервером, с указанного URL-адреса, необязательно в режиме аутентификации.

Свойства экземпляра

Этот интерфейс также наследует свойства от своего родителя, EventTarget.

EventSource.readyState Только для чтения

Число, представляющее состояние соединения. Возможные значения: CONNECTING (0), OPEN (1), или CLOSED (2).

EventSource.url Только для чтения

Строка, представляющая URL-адрес источника.

EventSource.withCredentials Только для чтения

Булево значение, указывающее, был ли объект EventSource создан с параметрами аутентификации между доменами (CORS) (true), или нет (false, значение по умолчанию).

Методы экземпляра

Этот интерфейс также наследует методы от своего родителя, EventTarget.

EventSource.close()

Закрывает соединение, если оно есть, и устанавливает значение атрибута readyState в CLOSED. Если соединение уже закрыто, метод ничего не делает.

События

error

Срабатывает, когда открытие соединения с источником событий не удалось.

message

Срабатывает при получении данных от источника событий.

open

Срабатывает, когда соединение с источником событий было открыто.

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

Примеры

В этом базовом примере создается EventSource для получения безымянных событий с сервера; страница с именем sse.php отвечает за генерацию событий.

const evtSource = new EventSource("sse.php");
const eventList = document.querySelector("ul");

evtSource.onmessage = (e) => {
  const newElement = document.createElement("li");

  newElement.textContent = `message: ${e.data}`;
  eventList.appendChild(newElement);
};

Каждое полученное событие приводит к выполнению обработчика событий EventSource объекта onmessage. В свою очередь, он создает новый элемент <li> и записывает данные сообщения в него, а затем добавляет новый элемент в список, уже существующий в документе.

Примечание: Вы можете найти полный пример на GitHub — см. Простой пример SSE с использованием PHP.

Для прослушивания именованных событий вам потребуется обработчик для каждого типа отправленного события.

const sse = new EventSource("/api/v1/sse");

/*
 * This will listen only for events
 * similar to the following:
 *
 * event: notice
 * data: useful data
 * id: some-id
 */
sse.addEventListener("notice", (e) => {
  console.log(e.data);
});

/*
 * Similarly, this will listen for events
 * with the field `event: update`
 */
sse.addEventListener("update", (e) => {
  console.log(e.data);
});

/*
 * The event "message" is a special case, as it
 * will capture events without an event field
 * as well as events that have the specific type
 * `event: message` It will not trigger on any
 * other event type.
 */
sse.addEventListener("message", (e) => {
  console.log(e.data);
});

Спецификации

Спецификация
HTML
# the-eventsource-interface

Совместимость с браузерами

Рабочий стол Мобильные устройства
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet WebView Android
EventSource 6 79 6 11 5 18 45 12 5 1.0 4.4
EventSource 6 79 6 11 5 18 45 11 5 1.0 4.4
close 6 79 6 12 5 18 45 12 5 1.0 4.4
error_event 6 79 6 12 5 18 45 12 5 1.0 4.4
message_event 6 79 6 12 5 18 45 12 5 1.0 4.4
open_event 6 79 6 12 5 18 45 12 5 1.0 4.4
readyState 6 79 6 12 5 18 45 12 5 1.0 4.4
url 18 79 6 12 6 18 45 12 6 1.0 4.4
withCredentials 26 79 6 12 7 26 45 12 7 1.5 4.4
worker_support 6 79 133
53–133Не поддерживается в service workers.
≤15 5 18 133
53–133Не поддерживается в service workers.
≤14 5 1.0 ≤37

См. также

  • Server-sent events
  • Использование server-sent events

© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/EventSource

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API