# EventEmitter.on()

```ts
on<K extends keyof T>(event: K, handler: EventHandler<T[K]>, options?: SubscribeOptions): () => void
```

Subscribe to a typed event. `on()` returns the unsubscribe; `Kernstra.events.on` takes the same options as `viewer.on`.

- Kind: method
- Since: 1.0.0

| Parameter | Type | Description |
| --- | --- | --- |
| `event` | `K` | An event name of this emitter's map: `GlobalEventMap` on `Kernstra.events`, `ViewerEventMap` on a viewer. |
| `handler` | `EventHandler<T[K]>` | Receives the typed payload. One that throws is logged and does not stop the others. |
| `options?` | `SubscribeOptions` | `{ once?: boolean; signal?: AbortSignal }`. `once` hears the next emit only; `signal` unsubscribes when the `AbortSignal` aborts, so one `AbortController` can end every subscription a component made (a signal already aborted subscribes nothing). |

Returns `() => void`: The unsubscribe.

```ts
const stop = viewer.on('pageChanged', ({ pageIndex }) => setCurrentPage(pageIndex));
stop();

const controller = new AbortController();
viewer.on('zoomChanged', ({ scale }) => setZoom(scale), { signal: controller.signal });
viewer.on('documentChanged', () => markDirty(), { signal: controller.signal });
controller.abort(); // both gone

Kernstra.events.on('initialized', ({ version }) => console.log(version), { once: true });
```

Part of [EventEmitter](https://kernstra.com/docs/web-sdk/api/eventemitter) in the Kernstra Web SDK 1.0.0 API reference.

Web page: https://kernstra.com/docs/web-sdk/api/eventemitter/on
