# Lage et spill ved hjelp av hendelser
Har du noen gang lurt på hvordan nettsteder vet når du klikker på en knapp eller skriver i en tekstboks? Det er magien ved hendelsesdrevet programmering! Hva er vel en bedre måte å lære denne viktige ferdigheten på enn å bygge noe nyttig – et skrivhastighetsspill som reagerer på hvert tastetrykk du gjør.
Du skal få se på nært hold hvordan nettlesere "snakker" med JavaScript-koden din. Hver gang du klikker, skriver eller flytter musen, sender nettleseren små meldinger (vi kaller dem hendelser) til koden din, og du bestemmer hvordan du vil svare!
Når vi er ferdige her, har du laget et ekte skrivspill som følger med på hastigheten og nøyaktigheten din. Enda viktigere er at du vil forstå de grunnleggende konseptene som driver hvert interaktivt nettsted du noen gang har brukt. La oss sette i gang!
## Før-forelesnings-quiz
[Før-forelesnings-quiz](https://ff-quizzes.netlify.app/web/quiz/21)
## Hendelsesdrevet programmering
Tenk på din favorittapp eller favorittnettsted – hva gjør at det føles levende og responsivt? Det handler om hvordan det reagerer på det du gjør! Hvert trykk, klikk, sveip eller tastetrykk lager det vi kaller en "hendelse", og det er der den virkelige magien i webutvikling skjer.
Her er det som gjør programmering for nettet så interessant: vi vet aldri når noen vil klikke på knappen eller begynne å skrive i en tekstboks. De kan klikke med en gang, vente fem minutter, eller kanskje aldri klikke i det hele tatt! Denne uforutsigbarheten betyr at vi må tenke annerledes om hvordan vi skriver koden vår.
I stedet for å skrive kode som kjører ovenfra og ned som en oppskrift, skriver vi kode som tålmodig venter på at noe skal skje. Det er likt hvordan telegrafoperatører på 1800-tallet satt ved maskinene sine, klare til å svare i det øyeblikket en melding kom gjennom ledningen.
Men hva er egentlig en "hendelse"? Enkelt sagt, det er noe som skjer! Når du klikker på en knapp – det er en hendelse. Når du skriver en bokstav – det er en hendelse. Når du flytter på musa – det er en annen hendelse.
Hendelsesdrevet programmering lar oss sette opp koden vår til å lytte og svare. Vi lager spesielle funksjoner kalt **event listeners** som tålmodig venter på at bestemte ting skal skje, og så setter i gang når de gjør det.
Tenk på event listeners som en dørklokke for koden din. Du setter opp dørklokken (`addEventListener()`), forteller den hva slags lyd den skal lytte etter (som et 'click' eller 'keypress'), og spesifiserer hva som skal skje når noen ringer på (din egendefinerte funksjon).
**Slik fungerer event listeners:**
- **Lytter** etter spesifikke brukerhandlinger som klikk, tastetrykk eller musebevegelser
- **Utfører** din egendefinerte kode når den angitte hendelsen skjer
- **Reagerer** umiddelbart på brukerinteraksjoner, skaper en sømløs opplevelse
- **Håndterer** flere hendelser på samme element ved hjelp av ulike lyttere
> **MERK:** Det er verdt å nevne at det finnes mange måter å lage event listeners på. Du kan bruke anonyme funksjoner, eller lage navngitte funksjoner. Du kan bruke forskjellige snarveier, som å sette `click`-egenskapen, eller bruke `addEventListener()`. I øvelsen vår skal vi fokusere på `addEventListener()` og anonyme funksjoner, siden det sannsynligvis er den vanligste teknikken webutviklere bruker. Det er også den mest fleksible, da `addEventListener()` fungerer for alle hendelser, og hendelsesnavnet kan gis som en parameter.
### Vanlige hendelser
Selv om nettlesere tilbyr dusinvis av forskjellige hendelser du kan lytte etter, baserer de fleste interaktive apper seg på bare noen få essensielle hendelser. Å forstå disse kjernehendelsene gir deg fundamentet for å bygge sofistikerte brukerinteraksjoner.
Det finnes [dusiner av hendelser](https://developer.mozilla.org/docs/Web/Events) tilgjengelig som du kan lytte etter når du lager en applikasjon. I utgangspunktet løfter alt brukeren gjør på en side en hendelse, noe som gir deg stor kraft til å sikre at de får den opplevelsen du ønsker. Heldigvis trenger du vanligvis bare noen få hendelser. Her er noen vanlige (inkludert de to vi skal bruke i spillet vårt):
| Hendelse | Beskrivelse | Vanlige Bruksområder |
|----------|-------------|----------------------|
| `click` | Brukeren klikket på noe | Knapper, lenker, interaktive elementer |
| `contextmenu` | Brukeren klikket med høyre museknapp | Egne høyreklikk-menyvalg |
| `select` | Brukeren markerte noe tekst | Tekstredigering, kopiering |
| `input` | Brukeren skrev inn tekst | Skjemavalidering, sanntidssøk |
**Forstå disse hendelsestypene:**
- **Utløses** når brukere interagerer med bestemte elementer på siden din
- **Gir** detaljert informasjon om brukerens handling via hendelsesobjekter
- **Lar deg** lage responsive, interaktive nettapplikasjoner
- **Fungerer** konsekvent på tvers av forskjellige nettlesere og enheter
## Lage spillet
Nå som du forstår hvordan hendelser fungerer, la oss bruke kunnskapen i praksis ved å lage noe nyttig. Vi skal lage et skrivhastighetsspill som demonstrerer håndtering av hendelser samtidig som du utvikler en viktig utviklerferdighet.
Vi skal lage et spill for å utforske hvordan hendelser fungerer i JavaScript. Spillet vårt skal teste spillerens skrivingsevner, noe som er en av de mest undervurderte ferdighetene alle utviklere bør ha. Moro fakta: QWERTY-tastaturoppsettet vi bruker i dag, ble faktisk designet på 1870-tallet for skrivemaskiner – og gode skriveferdigheter er fortsatt like verdifulle for programmerere i dag! Spillflyten vår vil se slik ut:
```mermaid
flowchart TD
A[Spiller klikker Start] --> B[Tilfeldig sitat vises]
B --> C[Spiller skriver i tekstboksen]
C --> D{Ord fullført?}
D -->|Ja| E[Fremhev neste ord]
D -->|Nei| F{Riktig så langt?}
F -->|Ja| G[Behold normal stil]
F -->|Nei| H[Vis feilstil]
E --> I{Sitat fullført?}
I -->|Nei| C
I -->|Ja| J[Vis suksessmelding med tid]
G --> C
H --> C
```
**Slik fungerer spillet vårt:**
- **Starter** når spilleren klikker på startknappen og viser et tilfeldig sitat
- **Sporer** spillerens skriveprogresjon ord for ord i sanntid
- **Fremhever** det nåværende ordet for å lede spillerens fokus
- **Gir** umiddelbar visuell tilbakemelding ved skrivefeil
- **Beregner** og viser total tid når sitatet er fullført
La oss bygge spillet vårt og lære om hendelser!
### Filstruktur
Før vi begynner å kode, la oss få orden på ting! Å ha en ryddig filstruktur helt fra starten vil spare deg for mye trøbbel senere og gjøre prosjektet ditt mer profesjonelt. 😊
Vi skal holde det enkelt med bare tre filer: `index.html` for sidestrukturen, `script.js` for all spilllogikken, og `style.css` for å få alt til å se bra ut. Dette er den klassiske trioen som driver mesteparten av nettet!
**Lag en ny mappe til arbeidet ditt ved å åpne en konsoll- eller terminalvindu og skrive følgende kommando:**
```bash
# Linux eller macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Dette gjør disse kommandoene:**
- **Oppretter** en ny mappe kalt `typing-game` for prosjektfilene dine
- **Går inn i** den nylig opprettede mappen automatisk
- **Setter opp** et rent arbeidsområde for spillutviklingen din
**Åpne Visual Studio Code:**
```bash
code .
```
**Denne kommandoen:**
- **Starter** Visual Studio Code i gjeldende mappe
- **Åpner** prosjektmappen i editoren
- **Gir** tilgang til alle utviklingsverktøyene du trenger
**Legg til tre filer i mappen i Visual Studio Code med følgende navn:**
- `index.html` - Inneholder strukturen og innholdet i spillet ditt
- `script.js` - Håndterer all spilllogikk og event listeners
- `style.css` - Definerer det visuelle uttrykket og stilen
## Lag brukergrensesnittet
Nå skal vi bygge scenen hvor all spillaktiviteten skjer! Tenk på det som å designe kontrollpanelet for et romskip – vi må sørge for at alt spillerne trenger er akkurat der de forventer det.
La oss finne ut hva spillet vårt faktisk trenger. Om du skulle spilt et skrivspill, hva ville du ønsket å se på skjermen? Her er hva vi trenger:
| UI-element | Formål | HTML-element |
|------------|--------|--------------|
| Sitatvisning | Viser teksten som skal skrives | `
` med `id="quote"` |
| Meldingområde | Viser status- og suksessmeldinger | `
` med `id="message"` |
| Tekstinnskriving | Hvor spilleren skriver sitatet | `` med `id="typed-value"` |
| Startknapp | Starter spillet | `