# Bygg en bankapp del 2: Bygg et innloggings- og registreringsskjema
```mermaid
journey
title Din Skjemautviklingsreise
section HTML-grunnlag
Forstå skjemaelementer: 3: Student
Lær inputtyper: 4: Student
Mestre tilgjengelighet: 4: Student
section JavaScript-integrasjon
Håndter skjemainnsending: 4: Student
Implementer AJAX-kommunikasjon: 5: Student
Behandle serverresponser: 5: Student
section Valideringssystemer
Lag flerlagsvalidering: 5: Student
Forbedre brukeropplevelsen: 5: Student
Sikre dataintegritet: 5: Student
```
## Pre-forelesningsquiz
[Pre-forelesningsquiz](https://ff-quizzes.netlify.app/web/quiz/43)
Har du noen gang fylt ut et skjema på nettet og fått det til å avvise e-postformatet ditt? Eller mistet all informasjonen din når du trykket på send? Vi har alle opplevd disse frustrerende situasjonene.
Skjemaer er broen mellom brukerne dine og funksjonaliteten i applikasjonen din. Som de nøye protokollene flygelederne bruker for å styre fly trygt til destinasjonene sine, gir godt designede skjemaer klare tilbakemeldinger og forhindrer kostbare feil. Dårlige skjemaer kan derimot skremme brukere unna raskere enn en misforståelse på en travel flyplass.
I denne leksjonen skal vi forvandle din statiske bankapp til en interaktiv applikasjon. Du vil lære å bygge skjemaer som validerer brukerinput, kommuniserer med servere og gir nyttige tilbakemeldinger. Tenk på det som å bygge kontrollgrensesnittet som lar brukere navigere appens funksjoner.
På slutten vil du ha et komplett innloggings- og registreringssystem med validering som veileder brukerne mot suksess i stedet for frustrasjon.
```mermaid
mindmap
root((Skjemautvikling))
HTML Foundation
Semantiske Elementer
Inputtyper
Tilgjengelighet
Etikettassosiasjon
User Experience
Valideringsfeedback
Feilforebygging
Lastetilstander
Suksessmeldinger
JavaScript Integration
Hendelseshåndtering
AJAX-kommunikasjon
Databehandling
Feilhåndtering
Validation Layers
HTML5-validering
Klientside-logikk
Serverside-sikkerhet
Progressiv Forbedring
Modern Patterns
Fetch API
Async/Await
Form Data API
Promise Handling
```
## Forutsetninger
Før vi begynner å bygge skjemaer, la oss forsikre oss om at alt er satt opp riktig. Denne leksjonen fortsetter akkurat der vi slapp i forrige, så hvis du hoppet frem, vil du kanskje gå tilbake og få grunnleggende funksjoner til å fungere først.
### Påkrevde oppsett
| Komponent | Status | Beskrivelse |
|-----------|--------|-------------|
| [HTML-maler](../1-template-route/README.md) | ✅ Påkrevd | Din grunnleggende bankappstruktur |
| [Node.js](https://nodejs.org) | ✅ Påkrevd | JavaScript-runtime for serveren |
| [Bank API-server](../api/README.md) | ✅ Påkrevd | Backend-tjeneste for datalagring |
> 💡 **Utviklertips**: Du vil kjøre to separate servere samtidig – en for frontend bankappen din og en annen for backend API. Dette oppsettet speiler ekte utvikling hvor frontend- og backend-tjenester opererer uavhengig.
### Serverkonfigurasjon
**Utviklingsmiljøet ditt vil inkludere:**
- **Frontend-server**: Server din bankapp (vanligvis port `3000`)
- **Backend API-server**: Håndterer datalagring og henting (port `5000`)
- **Begge serverne** kan kjøre samtidig uten konflikter
**Testing av din API-tilkobling:**
```bash
curl http://localhost:5000/api
# Forventet svar: "Bank API v1.0.0"
```
**Hvis du ser API-versjonssvaret, er du klar til å fortsette!**
---
## Forstå HTML-skjemaer og kontroller
HTML-skjemaer er hvordan brukere kommuniserer med din webapplikasjon. Tenk på dem som telegrafsystemet som koblet fjerne steder sammen på 1800-tallet – de er kommunikasjonsprotokollen mellom brukerens intensjon og applikasjonens respons. Når de er gjennomtenkt designet, fanger de opp feil, veileder inputformatering og gir nyttige forslag.
Moderne skjemaer er betydelig mer sofistikerte enn grunnleggende tekstfelt. HTML5 introduserte spesialiserte input-typer som automatisk håndterer e-postvalidering, tallformatering og datovalidering. Disse forbedringene gavner både tilgjengelighet og mobilbrukeropplevelse.
### Essensielle skjemaelementer
**Byggeklosser alle skjema trenger:**
```html
```
**Dette gjør koden:**
- **Oppretter** en skjema-beholder med en unik identifikator
- **Spesifiserer** HTTP-metoden for datainnsending
- **Knytter** etiketter til input-feltene for tilgjengelighet
- **Definerer** en send-knapp for å behandle skjemaet
### Moderne input-typer og attributter
| Input-type | Formål | Eksempelbruk |
|------------|---------|---------------|
| `text` | Generell tekstinput | `` |
| `email` | E-postvalidering | `` |
| `password` | Skjult tekstinnskriving | `` |
| `number` | Numerisk input | `` |
| `tel` | Telefonnummer | `` |
> 💡 **Moderne HTML5-fordel**: Bruk av spesifikke input-typer tilbyr automatisk validering, passende mobil-tastaturer og bedre tilgjengelighet uten ekstra JavaScript!
### Knapper typer og oppførsel
```html
```
**Dette gjør hver knappetype:**
- **Send-knapper**: Utløser skjema-innsending og sender data til angitt endepunkt
- **Tilbakestillingsknapper**: Gjenoppretter alle skjema-felt til utgangstilstanden
- **Vanlige knapper**: Har ingen standardfunksjon, krever tilpasset JavaScript for funksjonalitet
> ⚠️ **Viktig merknad**: ``-elementet er selv-lukkende og trenger ikke slutt-tagg. Moderne anbefaling er å skrive `` uten skråstrek.
### Bygge innloggingsskjemaet ditt
La oss nå lage et praktisk innloggingsskjema som demonstrerer moderne HTML-skjema-praksis. Vi starter med en grunnleggende struktur og forbedrer gradvis med tilgjengelighetsfunksjoner og validering.
```html
Bank App
Login
```
**Dette skjer her:**
- **Strukturerer** skjema med semantiske HTML5-elementer
- **Grupperer** relaterte elementer i `div`-beholdere med meningsfulle klasser
- **Knytter** etiketter til input ved bruk av `for` og `id`-attributter
- **Inkluderer** moderne attributter som `autocomplete` og `placeholder` for bedre brukeropplevelse
- **Legger til** `novalidate` for å håndtere validering med JavaScript i stedet for nettleserens standard
### Kraften av riktige etiketter
**Hvorfor etiketter er viktig for moderne webutvikling:**
```mermaid
graph TD
A[Merkeelement] --> B[Skjermleserstøtte]
A --> C[Utvidelse av klikkmål]
A --> D[Skjemavalidering]
A --> E[SEO-fordeler]
B --> F[Tilgjengelig for alle brukere]
C --> G[Bedre mobilopplevelse]
D --> H[Klar feilmelding]
E --> I[Bedre søkeplassering]
```
**Hva riktige etiketter oppnår:**
- **Gjør det mulig** for skjermlesere å lese opp skjema-feltene tydelig
- **Utvider** den klikkbare sonen (klikk på etiketten fokuserer input)
- **Forbedrer** brukbarhet på mobil med større berøringsmål
- **Støtter** skjema-validering med meningsfulle feilmeldinger
- **Forbedrer** SEO ved å gi semantisk mening til skjema-elementer
> 🎯 **Tilgjengelighetsmål**: Hvert skjema-input bør ha en tilhørende etikett. Denne enkle praksisen gjør skjemaene dine brukbare for alle, inkludert brukere med nedsatt funksjonsevne, og forbedrer opplevelsen for alle.
### Opprette registreringsskjemaet
Registreringsskjemaet krever mer detaljert informasjon for å opprette en fullstendig brukerprofil. La oss bygge det med moderne HTML5-funksjoner og forbedret tilgjengelighet.
```html
Register
```
**I ovenstående har vi:**
- **Organisert** hvert felt i containere (`div`) for bedre styling og oppsett
- **Lagt til** passende `autocomplete`-attributter for nettleserens autofyll-støtte
- **Inkludert** hjelpsom plassholdertekst for å veilede brukerinput
- **Satt** fornuftige standardverdier ved bruk av `value`-attributtet
- **Brukt** valideringsattributter som `required`, `maxlength` og `min`
- **Brukt** `type="number"` for saldo-feltet med desimalstøtte
### Utforske input-typer og oppførsel
**Moderne input-typer gir utvidet funksjonalitet:**
| Egenskap | Fordel | Eksempel |
|---------|---------|----------|
| `type="number"` | Numerisk tastatur på mobil | Letter inntasting av saldo |
| `step="0.01"` | Kontroll på desimalnøyaktighet | Tillater cent i valuta |
| `autocomplete` | Nettleser autofyll | Raskere utfylling |
| `placeholder` | Kontekstuelle hint | Veileder brukerforventninger |
> 🎯 **Tilgjengelighetsutfordring**: Prøv å navigere skjemaene med bare tastaturet! Bruk `Tab` for å bevege deg mellom feltene, `Space` for å hake av bokser, og `Enter` for å sende inn. Denne opplevelsen hjelper deg å forstå hvordan skjermlesere-brukere samhandler med skjemaene dine.
### 🔄 **Pedagogisk gjennomgang**
**Forståelse av skjema-grunnlag**: Før du implementerer JavaScript, sørg for at du forstår:
- ✅ Hvordan semantisk HTML skaper tilgjengelige skjema-strukturer
- ✅ Hvorfor input-typer er viktige for mobil-tastaturer og validering
- ✅ Forholdet mellom etiketter og skjema-kontroller
- ✅ Hvordan skjemaattributter påvirker nettleserens standardatferd
**Rask selvtest**: Hva skjer dersom du sender inn et skjema uten JavaScript?
*Svar: Nettleseren utfører standard innsending, vanligvis ved å omdirigere til action-URL*
**Fordeler med HTML5-skjemaer**: Moderne skjemaer tilbyr:
- **Innebygd validering**: Automatisk e-post- og tallformatkontroll
- **Mobiloptimalisering**: Passende tastaturer for ulike input-typer
- **Tilgjengelighet**: Skjermleserstøtte og tastaturnavigering
- **Progressiv forbedring**: Fungerer også når JavaScript er deaktivert
## Forstå metoder for skjema-innsending
Når noen fyller ut skjemaet ditt og trykker på send, må dataene sendes et sted – vanligvis til en server som kan lagre det. Det finnes et par forskjellige måter å gjøre dette på, og å vite hvilken du skal bruke kan spare deg for problemer senere.
La oss se på hva som faktisk skjer når noen klikker på send-knappen.
### Standard oppførsel for skjema
Først, la oss observere hva som skjer med et grunnleggende skjema:
**Test dine nåværende skjemaer:**
1. Klikk på *Registrer*-knappen i skjemaet ditt
2. Observer endringene i nettleserens adressefelt
3. Legg merke til hvordan siden lastes på nytt og data vises i URLen

### Sammenligning av HTTP-metoder
```mermaid
graph TD
A[Skjema innsending] --> B{HTTP-metode}
B -->|GET| C[Data i URL]
B -->|POST| D[Data i forespørselskropp]
C --> E[Synlig i adressefelt]
C --> F[Begrenset datastørrelse]
C --> G[Bokmerkevennlig]
D --> H[Skjult fra URL]
D --> I[Stor datakapasitet]
D --> J[Mere sikker]
```
**Forstå forskjellene:**
| Metode | Bruksområde | Data-plassering | Sikkerhetsnivå | Størrelsesbegrensning |
|--------|----------|---------------|----------------|-------------|
| `GET` | Søkespørringer, filtrering | URL-parametere | Lav (synlig) | ~2000 tegn |
| `POST` | Brukerkontoer, sensitiv data | Forespørselskropp | Høyere (skjult) | Ingen praktisk grense |
**Grunnleggende forskjeller:**
- **GET**: Legger skjema-data til URL som spørringsparametere (passer for søk)
- **POST**: Inkluderer data i forespørselskroppen (essensielt for sensitiv info)
- **GET-begrensninger**: Størrelsesbegrensninger, synlig data, persistente nettleserhistorikk
- **POST-fordeler**: Stor datakapasitet, personvern, støtte for filopplasting
> 💡 **Beste praksis**: Bruk `GET` for søkeskjemaer og filtre (datauthenting), bruk `POST` for brukerregistrering, innlogging og dataskaping.
### Konfigurere skjema-innsending
La oss konfigurere registreringsskjemaet ditt til å kommunisere korrekt med backend-APIen ved å bruke POST-metoden:
```html
```
**Forstå den forbedrede valideringen:**
- **Kombinerer** obligatoriske felter med hjelpetekster
- **Inkluderer** `pattern`-attributter for formatvalidering
- **Gir** `title`-attributter for tilgjengelighet og verktøytips
- **Legger til** hjelpetekst for å veilede brukerinnputt
- **Bruker** semantisk HTML for bedre tilgjengelighet
### Avanserte valideringsregler
**Hva hver valideringsregel oppnår:**
| Felt | Valideringsregler | Brukerfordel |
|-------|------------------|--------------|
| Brukernavn | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | Sikrer gyldige, unike identifikatorer |
| Valuta | `required`, `maxlength="3"`, `pattern="[A-Z$€£¥₹]+"` | Aksepterer vanlige valutasymboler |
| Saldo | `min="0"`, `step="0.01"`, `type="number"` | Forhindrer negative saldoer |
| Beskrivelse | `maxlength="100"` | Rimelige lengdebegrensninger |
### Teste valideringsatferd
**Prøv disse valideringsscenarioene:**
1. **Send inn** skjemaet med tomme obligatoriske felt
2. **Skriv inn** et brukernavn kortere enn 3 tegn
3. **Prøv** spesialtegn i brukernavnfeltet
4. **Skriv inn** et negativt saldo-beløp

**Dette vil du observere:**
- **Nettleser viser** native valideringsmeldinger
- **Stilen endres** basert på `:valid` og `:invalid` tilstander
- **Skjemaet forhindres** fra innsending til alle valideringer er godkjent
- **Fokuset flyttes automatisk** til først ugyldige felt
### Klient- vs servervalidering
```mermaid
graph LR
A[Klient-side Validering] --> B[Umiddelbar Tilbakemelding]
A --> C[Bedre Brukeropplevelse]
A --> D[Redusert Serverbelastning]
E[Server-side Validering] --> F[Sikkerhet]
E --> G[Dataintegritet]
E --> H[Forretningsregler]
A -.-> I[Begge Kreves]
E -.-> I
```
**Hvorfor du trenger begge lagene:**
- **Klientvalidering**: Gir umiddelbar tilbakemelding og forbedrer brukeropplevelsen
- **Servervalidering**: Sikrer sikkerhet og håndterer komplekse forretningsregler
- **Kombinert tilnærming**: Skaper robuste, brukervennlige og sikre applikasjoner
- **Progressiv forbedring**: Fungerer selv når JavaScript skrus av
> 🛡️ **Sikkerhetsminne**: Stol aldri bare på klientvalidering! Ondsinnede brukere kan omgå klientkontroller, så servervalidering er essensielt for sikkerhet og dataintegritet.
### ⚡ **Hva du kan gjøre på 5 minutter**
- [ ] Test skjemaet ditt med ugyldige data for å se valideringsmeldinger
- [ ] Prøv å sende inn skjemaet med JavaScript deaktivert og se HTML5-valideringen
- [ ] Åpne nettleserens DevTools og inspiser formdata som sendes til serveren
- [ ] Eksperimenter med ulike input-typer for å se endringer i mobiltastatur
### 🎯 **Hva du kan oppnå denne timen**
- [ ] Fullfør quiz etter leksjonen og forstå formhåndteringskonsepter
- [ ] Implementer den omfattende valideringsutfordringen med sanntidsfeedback
- [ ] Legg til CSS-styling for profesjonelt utseende skjemaer
- [ ] Lag feilhåndtering for dupliserte brukernavn og serverfeil
- [ ] Legg til passordbekreftelsesfelt med samsvarende validering
### 📅 **Din uke-lange reise til Skjema-Mester**
- [ ] Fullfør hele bankappen med avanserte formfunksjoner
- [ ] Implementer filopplastingsmuligheter for profilbilder eller dokumenter
- [ ] Legg til flerstegsforms med fremdriftsindikatorer og tilstandsadministrasjon
- [ ] Lag dynamiske skjemaer som tilpasser seg basert på brukervalg
- [ ] Implementer autosaving og gjenoppretting av skjema for bedre brukeropplevelse
- [ ] Legg til avansert validering som e-postverifisering og telefonnummerformatering
### 🌟 **Din måned-lange Frontend-utviklingsreise**
- [ ] Bygg komplekse formapplikasjoner med betinget logikk og arbeidsflyter
- [ ] Lær formbiblioteker og rammeverk for rask utvikling
- [ ] Mestre tilgjengelighetsretningslinjer og inkluderende designprinsipper
- [ ] Implementer internasjonalisering og lokalisering for globale skjemaer
- [ ] Lag gjenbrukbare formkomponentbiblioteker og designsystemer
- [ ] Bidra til open source formprosjekter og del beste praksis
## 🎯 Din tidslinje for skjema-utviklingsmester
```mermaid
timeline
title Skjemautvikling og brukeropplevelseslæring progresjon
section HTML Grunnlag (15 minutter)
Semantiske Skjemaer: Skjemaelementer
: Inntastingstyper
: Etiketter og tilgjengelighet
: Progressiv forbedring
section JavaScript Integrasjon (25 minutter)
Hendelseshåndtering: Skjema innsending
: Datainnsamling
: AJAX-kommunikasjon
: Async/await mønstre
section Valideringssystemer (35 minutter)
Flersjiktsikkerhet: HTML5 validering
: Klientside logikk
: Serverside verifisering
: Feilhåndtering
section Brukeropplevelse (45 minutter)
Grensesnittpolering: Lastestatus
: Meldinger for suksess
: Feilgjenoppretting
: Tilgjengelighetsfunksjoner
section Avanserte mønstre (1 uke)
Profesjonelle Skjemaer: Dynamisk validering
: Flersteg arbeidsflyter
: Filopplastinger
: Tilbakemeldinger i sanntid
section Enterprise ferdigheter (1 måned)
Produksjonsapplikasjoner: Skjemabiblioteker
: Teststrategier
: Ytelsesoptimalisering
: Beste sikkerhetspraksis
```
### 🛠️ Oppsummering av ditt skjema-utviklingsverktøy
Etter å ha fullført denne leksjonen, har du nå mestret:
- **HTML5-skjemaer**: Semantisk struktur, inputtyper og tilgjengelighetsfunksjoner
- **JavaScript-formhåndtering**: Hendelsesadministrasjon, datainnsamling og AJAX-kommunikasjon
- **Valideringsarkitektur**: Flere lag av validering for sikkerhet og brukeropplevelse
- **Asynkron programmering**: Moderne fetch API og async/await-mønstre
- **Feilhåndtering**: Omfattende feilbehandling og brukerfeedbacksystemer
- **Brukeropplevelsesdesign**: Lastetilstander, suksessmeldinger og feilinnhenting
- **Progressiv forbedring**: Skjemaer som fungerer på tvers av alle nettlesere og kapasiteter
**Virkelige bruksområder**: Skjemautviklingsferdighetene dine brukes direkte til:
- **E-handel**: Kasseprosesser, kontoregistrering og betalingsskjemaer
- **Bedriftsprogramvare**: Dataregistreringssystemer, rapporteringsgrensesnitt og arbeidsflyt-applikasjoner
- **Innholdshåndtering**: Publiseringsplattformer, bruker-generert innhold og administrative grensesnitt
- **Finansapplikasjoner**: Bankgrensesnitt, investeringsplattformer og transaksjonssystemer
- **Helsesystemer**: Pasientportaler, timebestillinger og medisinske journaler
- **Utdanningsplattformer**: Kursregistreringer, vurderingsverktøy og læringsadministrasjon
**Profesjonelle ferdigheter du har oppnådd**: Du kan nå:
- **Designe** tilgjengelige skjemaer som fungerer for alle brukere, inkludert de med funksjonsnedsettelser
- **Implementere** sikker formvalidering som forhindrer datakorrupsjon og sikkerhetshull
- **Skape** responsive brukergrensesnitt som gir tydelig tilbakemelding og veiledning
- **Feilsøke** komplekse forminteraksjoner med nettleserens utviklerverktøy og nettverksanalyse
- **Optimalisere** formytelse gjennom effektiv databehandling og valideringsstrategier
**Frontend-utviklingskonsepter du har mestret**:
- **Hendelsesdrevet arkitektur**: Håndtering av brukerinteraksjon og respons
- **Asynkron programmering**: Ikke-blokkerende serverkommunikasjon og feilhåndtering
- **Datavalidering**: Klient- og server-sikkerhets- og integritetskontroller
- **Brukeropplevelsesdesign**: Intuitive grensesnitt som veileder brukerne til suksess
- **Tilgjengelighetsinfrastruktur**: Inkluderende design som fungerer for mangfoldige brukerbehov
**Neste nivå**: Du er klar til å utforske avanserte formbiblioteker, implementere komplekse valideringsregler eller bygge datainnsamlingssystemer for bedriftsbruk!
🌟 **Prestasjon oppnådd**: Du har bygget et komplett system for formhåndtering med profesjonell validering, feilhåndtering og brukeropplevelsesmønstre!
---
---
## GitHub Copilot Agent Challenge 🚀
Bruk Agent-modus for å fullføre følgende utfordring:
**Beskrivelse:** Forbedre registreringsskjemaet med omfattende klient-side validering og brukerfeedback. Denne utfordringen hjelper deg å øve på formvalidering, feilhåndtering og forbedring av brukeropplevelse med interaktiv tilbakemelding.
**Prompt:** Lag et komplett valideringssystem for registreringsskjemaet som inkluderer: 1) Valideringsfeedback i sanntid for hvert felt mens brukeren skriver, 2) Egne valideringsmeldinger som vises under hvert inndatafelt, 3) Et passordbekreftelsesfelt med validering for samsvar, 4) Visuelle indikatorer (slik som grønne sjekkmerker for gyldige felt og røde varsler for ugyldige), 5) En send-knapp som kun aktiveres når alle valideringer er bestått. Bruk HTML5 valideringsattributter, CSS for styling av valideringstilstander, og JavaScript for interaktiv oppførsel.
Lær mer om [agent mode](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) her.
## 🚀 Utfordring
Vis en feilmelding i HTML hvis brukeren allerede eksisterer.
Her er et eksempel på hvordan den endelige innloggingssiden kan se ut etter litt styling:

## Quiz etter forelesning
[Quiz etter forelesning](https://ff-quizzes.netlify.app/web/quiz/44)
## Gjennomgang & Selvstudium
Utviklere har blitt svært kreative når det gjelder bygging av skjemaer, spesielt rundt valideringsstrategier. Lær om forskjellige skjema flyter ved å bla gjennom [CodePen](https://codepen.com); kan du finne noen interessante og inspirerende skjemaer?
## Oppgave
[Stil din bank-app](assignment.md)
---
**Ansvarsfraskrivelse**:
Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vennligst vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det opprinnelige dokumentet på dets opprinnelige språk skal anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som følge av bruk av denne oversettelsen.