# Installation af klienten

> Indlæs client.js fra Entase CDN, og opret derefter en instans. Der er ingen pakke at installere og intet buildtrin.

Klienten leveres fra Entase CDN som en enkelt fil. Der er ingen npm-pakke, intet bundle at bygge og ingen afhængighed, der skal holdes opdateret – du får altid den aktuelle version.

```html
<script src="https://js.entase.com/client.js"></script>
```

Indlæsning af scriptet definerer en global `Entase`-klasse. Det gør ikke andet i sig selv: ingen netværksanmodninger, ingen DOM-ændringer, intet renderet. Alt starter, når du opretter en instans.

## Oprettelse af en instans

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

Opret **én instans pr. side**, og genbrug den for hver hændelse. Konstruktøren registrerer en `message`-lytter på window og begynder at registrere, hvilken checkout-tilstand dit domæne må bruge, så oprettelse af flere instanser medfører dobbelte lyttere og dobbelte registreringskald uden nogen fordel.

Alle indstillinger har en standardværdi, så `new Entase()` uden argumenter er gyldig – men uden `pk` kan klienten ikke bekræfte, at dit domæne må bruge integreret checkout, og falder altid tilbage til et pop op-vindue. Se [Checkout-tilstande](/developers/js-client/checkout-modes.md).

## Indlæsning af scriptet asynkront

Hvis du indlæser `client.js` med `async` eller `defer`, findes klassen endnu ikke, når dit inline-script kører. Biblioteket udsender en `entase:ready`-hændelse på `window`, når det er indlæst, så vent på den:

```html
<script src="https://js.entase.com/client.js" async></script>
<script>
  let entase = null;

  const init = () => { entase = new Entase({ pk: 'YOUR_PUBLISHABLE_KEY' }); };

  if (typeof Entase !== 'undefined') init();
  else window.addEventListener('entase:ready', init);
</script>
```

Det er vigtigt først at kontrollere med `typeof`: Hvis scriptet allerede er færdigindlæst, er `entase:ready` allerede blevet udløst, og hvis du lytter efter den, vil du vente for evigt.

## Oprydning

I en single-page-applikation skal du kalde `destroy()`, når visningen, der ejer instansen, afmonteres:

```js
entase.destroy();
```

Dette fjerner de window-lyttere, som klienten har registreret. En destrueret instans kan ikke genbruges – et kald til `book()` på den logger en fejl og gør intet. Opret i stedet en ny instans.

## Content Security Policy

Hvis dit website sender en `Content-Security-Policy`-header, kræver checkout:

- `script-src https://js.entase.com` – for at indlæse biblioteket.
- `frame-src https://www.entase.com` – checkout gengives i en iframe i paneltilstand.
- `connect-src https://www.entase.com` – klienten kalder Entase API'et for at fastslå den tilladte checkout-tilstand.

Uden `frame-src` giver paneltilstand et tomt panel. Uden `connect-src` mislykkes tilstandsregistreringen, og alle checkouts åbnes som pop op-vinduer.
