EventSource
Базовая Широко доступна *
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с января 2020 года.
* Некоторые части этой функции могут иметь различный уровень поддержки.
Примечание: Эта функция доступна в Web Workers.
Интерфейс EventSource — это интерфейс веб-контента для событий, отправляемых сервером.
Экземпляр EventSource открывает постоянное соединение с сервером HTTP, который отправляет события в формате text/event-stream. Соединение остается открытым до тех пор, пока его не закроют, вызвав EventSource.close().
После открытия соединения входящие сообщения с сервера доставляются вашему коду в виде событий. Если в входящем сообщении есть поле 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 | 13353–133Не поддерживается в service workers. |
≤15 | 5 | 18 | 13353–133Не поддерживается в service workers. |
≤14 | 5 | 1.0 | ≤37 |
См. также
© 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