# События

> Отслеживайте открытие и закрытие оформления заказа, а также согласие с условиями с помощью on() и off(); узнайте о правиле «один обработчик на событие».

Оформление заказа сообщает вашей странице о своих действиях. Подпишитесь с помощью `on()`:

```js
entase.on('checkout.ready', payload => {
  console.log('checkout open for', payload.context.eventID);
});
```

## Один обработчик на имя события

`on()` сохраняет **один** обратный вызов для каждого имени события. Регистрация второго обратного вызова с тем же именем заменяет первый – она не добавляется к нему:

```js
entase.on('checkout.closed', a);
entase.on('checkout.closed', b);   // a is gone; only b runs
```

`off()` удаляет всё, что зарегистрировано для имени. Он игнорирует любой переданный ему обратный вызов, поэтому `off('checkout.closed', b)` и `off('checkout.closed')` делают одно и то же.

Если нескольким частям вашей страницы нужно реагировать на одно и то же событие, зарегистрируйте один обратный вызов и распределяйте обработку внутри него.

## Подписка на несколько событий одновременно

Оба метода принимают строку с именами, разделёнными пробелами, или массив имён и регистрируют один и тот же обратный вызов для каждого из них:

```js
entase.on('checkout.ready checkout.closed', payload => {
  console.log(payload.name);
});

entase.off(['checkout.ready', 'checkout.closed']);
```

## Полезная нагрузка

Каждый обратный вызов получает один объект:

| Поле | Тип | Описание |
|---|---|---|
| `name` | string | Имя события; полезно, когда один обратный вызов обрабатывает несколько событий. |
| `context` | object | Содержит `eventID` – событие, к которому относится это оформление заказа. |
| `data` | object | Сведения, специфичные для события. |

## Доступные события

| Имя | Когда срабатывает |
|---|---|
| `checkout.ready` | Оформление заказа загружено и готово к взаимодействию. В этот момент клиент также получает переданный вами в `book()` `clientContext`. |
| `checkout.closed` | Оформление заказа закрыто. Клиент удаляет панель или окно и очищает фон. |
| `checkout.consent` | Посетитель ответил на уведомление об условиях. `data.consent` имеет значение `true`, если он принял условия, и клиент запоминает это, чтобы в следующий раз пропустить этот шаг. |

```js
entase.on('checkout.closed', () => {
  document.body.classList.remove('checkout-open');
});

entase.on('checkout.consent', payload => {
  if (payload.data.consent) console.log('terms accepted');
});
```

## Обработчики сохраняются между отдельными бронированиями

Обработчики принадлежат экземпляру, а не бронированию. Зарегистрируйте их один раз после создания клиента, и они будут применяться к каждому вызову `book()`. Используйте `payload.context.eventID`, чтобы различать бронирования:

```js
const entase = new Entase({ pk: 'YOUR_PUBLISHABLE_KEY' });

entase.on('checkout.closed', payload => {
  refreshAvailability(payload.context.eventID);
});
```

Вызов `destroy()` останавливает их все – экземпляр полностью перестаёт прослушивать сообщения от оформления заказа.

## Сообщения из других источников игнорируются

Клиент принимает сообщения только из источника оформления заказа Entase, поэтому несвязанный трафик `postMessage` на вашей странице никогда не попадёт в ваши обратные вызовы.
