Tilbake
5.3
DOM-manipulering

5.3 DOM-manipulering

Lær å bruke JavaScript til å finne, endre, opprette og slette HTML-elementer.

65 min
8 oppgaver
DOMdocumentquerySelectorinnerHTML
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 8 oppgaver

DOM-manipulering

No som du kan grunnleggjande JavaScript, er det på tide å kople språket til nettsida. DOM-manipulering handlar om å bruke JavaScript til å finne HTML-element på sida og endre dei – endre tekst, stil, leggje til nye element eller fjerne eksisterande. Dette er kjernen i interaktiv webutvikling.

Når nettlesaren lastar ei HTML-side, byggjer han opp ein Document Object Model (DOM) – ei trestruktur der kvart HTML-element er eit objekt. JavaScript kan navigere i dette treet, lese innhaldet og eigenskapane til elementa, og endre dei. Endringar i DOM-en blir reflekterte umiddelbart på skjermen, slik at brukaren ser oppdateringane utan å laste sida på nytt.

Document Object Model (DOM)
DOM (Document Object Model) er eit programmeringsgrensesnitt (API) som representerer eit HTML-dokument som ei trestruktur av objekt. Kvar HTML-tag blir ein node i treet, med document som rotnode. JavaScript bruker DOM-en for å lese og endre nettsida dynamisk. Nettlesaren held DOM-en synkronisert med det som blir vist på skjermen – når du endrar eit element i DOM-en, blir visinga oppdatert automatisk.

Før du kan endre eit element, må du finne det. JavaScript tilbyr fleire metodar for dette:

querySelector – den mest fleksible metoden

querySelector() bruker CSS-selektorar for å finne element:

// Finn det første elementet med id="overskrift"
const overskrift = document.querySelector("#overskrift");

// Finn det første elementet med klassen "info"
const info = document.querySelector(".info");

// Finn den første <p>-taggen
const avsnitt = document.querySelector("p");

// Finn det første <a>-elementet inne i en <nav>
const lenke = document.querySelector("nav a");

querySelectorAll – finn alle matchande element

// Finn ALLE elementer med klassen "kort"
const alleKort = document.querySelectorAll(".kort");

// Gå gjennom alle matchende elementer
alleKort.forEach(kort => {
  console.log(kort.textContent);
});

getElementById – finn element med ID

const element = document.getElementById("minId");

Døme med HTML

Gitt denne HTML-koden:

<h1 id="tittel">Min nettside</h1>
<p class="beskrivelse">Velkommen til siden min.</p>
<ul>
  <li class="punkt">Punkt 1</li>
  <li class="punkt">Punkt 2</li>
  <li class="punkt">Punkt 3</li>
</ul>

Kan vi finne elementa slik:

const tittel = document.querySelector("#tittel");
const beskrivelse = document.querySelector(".beskrivelse");
const allePunkter = document.querySelectorAll(".punkt");

console.log(tittel.textContent);       // "Min nettside"
console.log(beskrivelse.textContent);  // "Velkommen til siden min."
console.log(allePunkter.length);       // 3

Når du har funne eit element, kan du endre innhaldet og eigenskapane:

Endre tekst med textContent

const overskrift = document.querySelector("#tittel");
overskrift.textContent = "Ny overskrift!";

Endre HTML med innerHTML

const boks = document.querySelector("#innhold");
boks.innerHTML = "<strong>Viktig:</strong> Denne teksten er <em>endret</em>.";

Endre attributter

const bilde = document.querySelector("img");
bilde.src = "nytt-bilde.jpg";
bilde.alt = "Et nytt bilde";

const lenke = document.querySelector("a");
lenke.href = "https://www.nrk.no";
lenke.target = "_blank";

Endre stiler direkte

const element = document.querySelector("#boks");
element.style.backgroundColor = "lightblue";
element.style.padding = "20px";
element.style.borderRadius = "10px";
element.style.fontSize = "18px";   // Merk: camelCase i stedet for bindestrek

Legg merke til at CSS-eigenskapar med bindestrek (som background-color) blir skrivne med camelCase i JavaScript (backgroundColor).

Den mest elegante måten å endre utsjånaden til element på er via CSS-klassar. I staden for å setje stilar direkte i JavaScript, definerer du klassar i CSS og legg dei til eller fjernar dei med JavaScript:

/* CSS */
.synlig { display: block; }
.skjult { display: none; }
.uthevet { background-color: yellow; font-weight: bold; }
.feilmelding { color: red; border: 2px solid red; padding: 10px; }

// JavaScript
const boks = document.querySelector("#meldingsboks");

// Legge til en klasse
boks.classList.add("uthevet");

// Fjerne en klasse
boks.classList.remove("skjult");

// Veksle en klasse (legger til hvis den mangler, fjerner hvis den finnes)
boks.classList.toggle("synlig");

// Sjekke om en klasse finnes
if (boks.classList.contains("feilmelding")) {
  console.log("Det er en feilmelding!");
}

// Legge til flere klasser samtidig
boks.classList.add("synlig", "uthevet");

Denne tilnærminga er betre enn å endre style direkte fordi:
- CSS-koden blir halden i stilarket der han høyrer heime
- Du kan bruke CSS-animasjonar og overgangar
- Koden er lettare å lese og vedlikehalde
- Fleire stilar blir endra med éin operasjon

JavaScript kan også lage heilt nye HTML-element og leggje dei til på sida:

Opprette nye element

// Opprett et nytt <li>-element
const nyttPunkt = document.createElement("li");
nyttPunkt.textContent = "Nytt listepunkt";
nyttPunkt.classList.add("punkt");

// Legg til i en eksisterende liste
const liste = document.querySelector("ul");
liste.appendChild(nyttPunkt);

Meir avansert: Byggje opp ei komplett struktur

// Lag et nytt kort-element
const kort = document.createElement("div");
kort.classList.add("kort");

const kortTittel = document.createElement("h3");
kortTittel.textContent = "Nytt kort";

const kortTekst = document.createElement("p");
kortTekst.textContent = "Dette kortet ble laget med JavaScript.";

const kortKnapp = document.createElement("button");
kortKnapp.textContent = "Les mer";

// Sett sammen strukturen
kort.appendChild(kortTittel);
kort.appendChild(kortTekst);
kort.appendChild(kortKnapp);

// Legg kortet til på siden
document.querySelector("#kortContainer").appendChild(kort);

Fjerne element

// Fjern et element
const element = document.querySelector("#gammelBoks");
element.remove();

// Alternativ: Fjern et barn-element
const liste = document.querySelector("ul");
const forstePunkt = liste.querySelector("li");
liste.removeChild(forstePunkt);

Erstatte element

const gammelElement = document.querySelector("#gammel");
const nyttElement = document.createElement("div");
nyttElement.textContent = "Nytt innhold";

gammelElement.replaceWith(nyttElement);

✏️Komplett døme: Dynamisk oppgåveliste

Her er eit komplett døme som kombinerer DOM-metodar for å lage ei interaktiv oppgåveliste:

HTML:

<h2>Min oppgaveliste</h2>
<div>
  <input type="text" id="nyOppgave" placeholder="Skriv en oppgave...">
  <button id="leggTil">Legg til</button>
</div>
<ul id="oppgaveliste"></ul>
<p id="teller">Antall oppgaver: 0</p>

JavaScript:

function leggTilOppgave() {
  const input = document.querySelector("#nyOppgave");
  const tekst = input.value.trim();

  if (tekst === "") {
    return;  // Ikke legg til tom oppgave
  }

  // Opprett nytt listeelement
  const li = document.createElement("li");
  li.textContent = tekst;

  // Opprett sletteknapp
  const slettKnapp = document.createElement("button");
  slettKnapp.textContent = "Slett";
  slettKnapp.style.marginLeft = "10px";
  slettKnapp.addEventListener("click", function () {
    li.remove();
    oppdaterTeller();
  });

  li.appendChild(slettKnapp);
  document.querySelector("#oppgaveliste").appendChild(li);

  // Tøm inputfeltet
  input.value = "";
  input.focus();

  oppdaterTeller();
}

function oppdaterTeller() {
  const antall = document.querySelectorAll("#oppgaveliste li").length;
  document.querySelector("#teller").textContent = "Antall oppgaver: " + antall;
}

document.querySelector("#leggTil").addEventListener("click", leggTilOppgave);

Dette dømet viser korleis createElement(), appendChild(), remove(), querySelector() og addEventListener() jobbar saman for å skape ei interaktiv brukaroppleving.

📝Oppgave 5.3.1

Kva er DOM-en (Document Object Model)?

📝Oppgave 5.3.2

Kva metode bruker du for å finne det første elementet med klassen "info"?

📝Oppgave 5.3.3

Kva er skilnaden mellom textContent og innerHTML?

📝Oppgave 5.3.4

Gitt denne HTML:

<ul id="liste">
  <li>A</li>
  <li>B</li>
  <li>C</li>
</ul>

Kva er resultatet av document.querySelectorAll("#liste li").length?

📝Oppgave 5.3.5

Skriv JavaScript-kode som finn eit element med id="melding" og gjer følgjande:
1. Endrar tekstinnhaldet til "Velkommen til IT1!"
2. Legg til CSS-klassen "uthevet"
3. Set bakgrunnsfargen til lyseblå

Skriv koden og forklar kva kvar linje gjer.

📝Oppgave 5.3.6

Skriv ein JavaScript-funksjon lagKort(tittel, beskrivelse) som opprettar ein ny <div> med klassen "kort", set inn ein <h3> med tittelen og ein <p> med skildringa, og legg kortet til i eit element med id="kortContainer". Test funksjonen med lagKort("JavaScript", "Et programmeringsspråk for webben").

📝Oppgave 5.3.7

Kvifor bør du unngå å setje inn brukardata med innerHTML?

📝Oppgave 5.3.8

Skriv JavaScript-kode som finn alle <li>-element på sida, og for kvart element som inneheld teksten "Viktig", legg til CSS-klassen "uthevet" og endrar tekstfargen til raud. Bruk querySelectorAll() og forEach().

Oppsummering

I dette kapittelet har du lært:

- DOM: representerer HTML-dokumentet som ei trestruktur av objekt.
- Finne element: querySelector, querySelectorAll og getElementById.
- Endre innhald: textContent og innerHTML.
- Endre attributt og stilar: direkte via JavaScript.
- Opprette og fjerne element: byggje dynamisk innhald.

Nøkkelomgrep


OmgrepForklaring
DOMTrestruktur som representerer HTML-dokumentet
querySelectorFinn første element som matchar ein selektor
textContentEigenskap for å lese/endre tekst

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.