# Събития

> Следете за отваряне и затваряне на плащането и за съгласие за записване чрез 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` | Страницата за плащане е заредена и е готова за взаимодействие. Тогава клиентът предава и `clientContext`, който сте подали на `book()`. |
| `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` на страницата ви никога няма да достигне до обратните ви извиквания.
