Lektion 7 — Client-side interaktivitet
Christian Budtz — chbu@dtu.dk
1 / 30
F fuld skærm · B sort · O overblik
Christian Budtz — chbu@dtu.dk
classListfetchPauser lægges ind undervejs.
Efter lektionen skal du kunne:
if/else if og sætte én CSS-klasse med classListfetch henter data fra en URL, mens siden kører i browserenGET /api/patients med async/await, tjekke response.ok og læse JSONcpr og navn)POST /api/login fra login-formularenorigin: '*'Vi læser ét felt, forgrener med if og sætter én CSS-klasse.
Prøv tomt felt, 89, 90, 139 og 140. Kun feltet Øvre ændrer farve.
| Input | Tekst | Klasse på Øvre |
|---|---|---|
| tomt | Udfyld feltet Øvre | fejl |
| 89 | Lav | lav |
| 90 | OK | ok |
| 139 | OK | ok |
| 140 | Høj | hoj |
Feltet Nedre er med i HTML'en, men koden læser det ikke. Bevidst.
I kan allerede:
getElementByIdaddEventListenerinnerTextI dag: læse et tal, forgrene, og skifte CSS-klasse.
const upper = document.getElementById("oevre");
const button = document.getElementById("vurder");
button.addEventListener("click", () => {
const raw = upper.value.trim();
// ...
});
value er altid en streng — også fra type="number".
CSS-klassen sidder på elementet. JavaScript tænder og slukker den:
upper.classList.remove("fejl", "lav", "ok", "hoj");
upper.classList.add("ok");
Fjern de gamle tilstande før du lægger den nye på. Ellers hænger forrige farve ved.
if (raw === "") {
result.innerText = "Udfyld feltet Øvre";
upper.classList.add("fejl");
return;
}
const value = Number(raw);
return stopper funktionen. Først derefter er det sikkert at bruge tallet.
if (value < 90) {
upper.classList.add("lav");
} else if (value <= 139) {
upper.classList.add("ok");
} else {
upper.classList.add("hoj");
}
89 er lav. 90 og 139 er OK. 140 er høj. Grænserne ligger i koden — ikke i CSS.
Gå til /quiz og indtast koden fra tavlen.
Lektion 7: DOM — events, classList, betingelser og Number.
I har hentet en JSON-liste og tegnet den i DOM'en (Authors Page).
I timen bruger vi samme mønster på patientlisten:
patient.navn læser et feltfetch er asynkront.then() — vi bruger async/awaitNyt i dag: response.ok, CORS, og rækker i en tabel.
Svaret fra API'et er tekst. res.json() giver JavaScript-objekter:
[
{ "cpr": "2512489996", "navn": "Nancy Ann Test Berggren" }
]
const patienter = await res.json();
console.log(patienter[0].navn);
Password kommer aldrig med i listen.
const res = await fetch("https://it3e26.vercel.app/api/patients");
const patienter = await res.json();
Siden bliver på skærmen. Browseren henter dataene i baggrunden.
await venter på svaret, uden at I skal kæde .then().
Funktionen, der bruger await, skal være async. Det er både fetch() og json().
fetch kaster ikke en fejl ved HTTP 401 eller 404. I får et svar — bare med en negativ status.
const res = await fetch("https://it3e26.vercel.app/api/patients");
if (!res.ok) {
throw new Error("Kunne ikke hente patienter");
}
const patienter = await res.json();
res.ok er sand, når status er 200–299.
Browseren blokerer fetch til et andet origin (anden protokol, host
eller port), medmindre serveren tillader det.
Underviser-API'et sender Access-Control-Allow-Origin: *, så kaldet virker
fra file:// og localhost.
I bygger ikke API'et i dag. CORS er grunden til, at I overhovedet kan kalde det.
thead står i HTML'en. Løkken fylder tbody — samme mønster som Authors Page.
<tbody id="liste"></tbody>
const tbody = document.getElementById("liste");
for (const p of patienter) {
tbody.innerHTML += `
<tr>
<td>${p.cpr}</td>
<td>${p.navn}</td>
</tr>
`;
}
textContent sætter teksten som tekst. Den version bruger I i øvelse 1.
const tbody = document.getElementById("liste");
tbody.innerHTML = "";
for (const p of patienter) {
const tr = document.createElement("tr");
const cpr = document.createElement("td");
const navn = document.createElement("td");
cpr.textContent = p.cpr;
navn.textContent = p.navn;
tr.append(cpr, navn);
tbody.append(tr);
}
Login er et POST med JSON i body:
const res = await fetch("https://it3e26.vercel.app/api/login", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ cpr: "...", password: "..." })
});
Husk event.preventDefault(), så formularen ikke genindlæser siden.
Kontrakt og testpatienter: API til Lektion 7.
Gå til /quiz og indtast koden fra tavlen.
Lektion 7: fetch — JSON, async/await, response.ok og CORS.
Hent GET /api/patients og vis cpr og navn i en tabel.
async/awaitresponse.oktbodyFormularen kalder POST /api/login — på jeres login.html eller samme
idé i projektet.
preventDefaultDer gemmes ingen session. I viser svaret i DOM'en.