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

Различные прикладные интерфейсы используют события «message» для организации асинхронных взаимодействий между независимыми контекстами выполнения. Все объекты -

<b>Window</b>
,
<b>Worker, WebSocket, EventSource</b>
и
<b>MessagePort</b>
- определяют свойство
<b>onmessage</b>
для регистрации обработчика события «message». Сообщение, связанное с событием «message», может быть любым значением, допустимым в языке JavaScript, которое можно скопировать, как описывается во врезке «Структурированные копии» в главе 22. Сообщение заключается в объект
<b>MessageEvent</b>
и доступно в виде свойства
<b>data</b>
. Различные прикладные интерфейсы, опирающиеся на событие «message», могут определять дополнительные свойства в объекте
<b>MessageEvent</b>
. События «message» не всплывают, и для них не предусмотрено действий по умолчанию, которые можно было бы отменить.

Свойства

<b>readonly any data</b>

Это свойство хранит доставленное сообщение. Свойство

<b>data</b>
может иметь значение любого типа, которое можно скопировать с применением алгоритма структурированного копирования (врезка «Структурированные копии» в главе 22). К ним относятся значения базового JavaScript, включая объекты и массивы, но не функции. Некоторые значения клиентского JavaScript, такие как узлы
<b>Document</b>
и
<b>Element</b>
, не могут передаваться, но могут передаваться объекты
<b>Blob</b>
и
<b>ArrayBuffer</b>
.

<b>readonly string lastEventld</b>

Для событий «message» в интерфейсе

<b>EventSource</b>
(раздел 18.3) это поле содержит строку
<b>lastEventld</b>
, если имеется, отправленную сервером.

<b>readonly string origin</b>

Для событий «message» в интерфейсах

<b>EventSource</b>
(раздел 18.3) или
<b>Window</b>
(раздел 22.3) это свойство содержит URL-адрес отправителя сообщения.

<b>readonly MessagePort[] ports</b>

Для событий «message» в интерфейсах

<b>Window</b>
(раздел 22.3),
<b>Worker</b>
(раздел 22.4) и
<b>MessagePort</b>
это свойство содержит массив объектов
<b>MessagePort</b>
, если он был передан соответствующему вызову
<b>postMessage().</b>

<b>readonly Window source</b>

Для событий «message» в интерфейсе

<b>Window</b>
(раздел 22.3) это свойство ссылается на объект
<b>Window</b>
, отправивший сообщение.

MessagePort

передает асинхронные сообщения (EventTarget)

Объект

<b>MessagePort</b>
используется для передачи асинхронных сообщений в виде событий, обычно между различными контекстами выполнения, такими как окна или фоновые потоки выполнения. Объекты
<b>MessagePort</b>
должны использоваться в виде связанных пар: см.
<b>MessageChannel</b>
. Вызов метода
<b>postMessage()</b>
объекта
<b>MessagePort</b>
генерирует событие «message» в связанном с ним объекте
<b>MessagePort</b>
. Прикладной интерфейс обмена меж доменными сообщениями (раздел 22.3) и фоновые потоки выполнения (раздел 22.4) также взаимодействуют с использованием объектов
<b>postMessage()</b>
и событий
<b>message</b>
. Эти прикладные интерфейсы фактически неявно используют объект
<b>MessagePort</b>
. Явное использование объектов
<b>MessageChannel</b>
и
<b>MessagePort</b>
позволяет создавать дополнительные, частные каналы обмена данными и может применяться, например, для организации непосредственных взаимодействий двух соседних фоновых потоков выполнения.

Типы

<b>MessageChannel</b>
и
<b>MessagePort</b>
являются нововведением, появившимся в спецификации HTML5, и на момент написания этих строк некоторые броузеры поддерживали меж доменный обмен сообщениями (раздел 22.3) и фоновые потоки выполнения (раздел 22.4) без применения частных каналов связи на основе объектов
<b>MessagePort</b>
.

Методы

<b>void close()</b>

Отключает данный объект

<b>MessagePort</b>
от порта, к которому он был подключен (если таковой имеется). Последующие вызовы метода
<b>postMessage()</b>
не будут иметь никакого эффекта, и в будущем сообщения «message» приходить не будут.

<b>void postMessage(any message, [MessagePort[] ports])</b>

Отправляет копию сообщения message через порт и передает его в форме события «message» порту, с которым соединен данный порт. Если указан аргумент ports, его значение также будет доставлено вместе с событием «message». Аргумент message может иметь любое значение, совместимое с алгоритмом структурированного копирования (врезка «Структурированные копии» в главе 22).

<b>void start()</b>

Запускает механизм возбуждения событий «message» в объекте

<b>MessagePort</b>
. До вызова этого метода все данные, отправляемые через порт, будут сохраняться в буфере. Подобная задержка событий позволяет сценариям зарегистрировать все обработчики событий до того, как будет отправлено хоть одно сообщение. Имейте, однако, в виду, что вызывать этот метод необходимо только при использовании метода
<b>addEventListener()</b>
интерфейса
<b>EventTarget</b>
. Если сценарий регистрирует обработчик посредством свойства
<b>onmessage</b>
, метод
<b>start()</b>
будет вызван неявно.

Обработчики событий