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

Nå som du kan grunnleggende JavaScript, er det på tide å koble språket til nettsiden. DOM-manipulering handler om å bruke JavaScript til å finne HTML-elementer på siden og endre dem – endre tekst, style, legge til nye elementer eller fjerne eksisterende. Dette er kjernen i interaktiv webutvikling.

Når nettleseren laster en HTML-side, bygger den opp en Document Object Model (DOM) – en trestruktur der hvert HTML-element er et objekt. JavaScript kan navigere i dette treet, lese elementenes innhold og egenskaper, og endre dem. Endringer i DOM-en reflekteres umiddelbart på skjermen, slik at brukeren ser oppdateringene uten å laste siden på nytt.

Document Object Model (DOM)
DOM (Document Object Model) er en programmeringsgrensesnitt (API) som representerer et HTML-dokument som en trestruktur av objekter. Hver HTML-tag blir en node i treet, med document som rotnode. JavaScript bruker DOM-en for å lese og endre nettsiden dynamisk. Nettleseren holder DOM-en synkronisert med det som vises på skjermen – når du endrer et element i DOM-en, oppdateres visningen automatisk.

Før du kan endre et element, må du finne det. JavaScript tilbyr flere metoder for dette:

querySelector – den mest fleksible metoden

querySelector() bruker CSS-selektorer for å finne elementer:

// 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 matchende elementer

// 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");

Eksempel 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 elementene 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 funnet et element, kan du endre innholdet og egenskapene:

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-egenskaper med bindestrek (som background-color) skrives med camelCase i JavaScript (backgroundColor).

Den mest elegante måten å endre utseendet til elementer er via CSS-klasser. I stedet for å sette stiler direkte i JavaScript, definerer du klasser i CSS og legger dem til eller fjerner dem 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ærmingen er bedre enn å endre style direkte fordi:
- CSS-koden holdes i stilarket der den hører hjemme
- Du kan bruke CSS-animasjoner og overganger
- Koden er lettere å lese og vedlikeholde
- Flere stiler endres med én operasjon

JavaScript kan også lage helt nye HTML-elementer og legge dem til på siden:

Opprette nye elementer

// 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);

Mer avansert: Bygge opp en 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 elementer

// 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 elementer

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

gammelElement.replaceWith(nyttElement);

✏️Komplett eksempel: Dynamisk oppgaveliste

Her er et komplett eksempel som kombinerer DOM-metoder for å lage en interaktiv oppgaveliste:

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 eksempelet viser hvordan createElement(), appendChild(), remove(), querySelector() og addEventListener() jobber sammen for å skape en interaktiv brukeropplevelse.

📝Oppgave 5.3.1

Hva er DOM-en (Document Object Model)?

📝Oppgave 5.3.2

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

📝Oppgave 5.3.3

Hva er forskjellen mellom textContent og innerHTML?

📝Oppgave 5.3.4

Gitt denne HTML:

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

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

📝Oppgave 5.3.5

Skriv JavaScript-kode som finner et element med id="melding" og gjør følgende:
1. Endrer tekstinnholdet til "Velkommen til IT1!"
2. Legger til CSS-klassen "uthevet"
3. Setter bakgrunnsfargen til lysblå

Skriv koden og forklar hva hver linje gjør.

📝Oppgave 5.3.6

Skriv en JavaScript-funksjon lagKort(tittel, beskrivelse) som oppretter en ny <div> med klassen "kort", setter inn en <h3> med tittelen og en <p> med beskrivelsen, og legger kortet til i et element med id="kortContainer". Test funksjonen med lagKort("JavaScript", "Et programmeringsspråk for webben").

📝Oppgave 5.3.7

Hvorfor bør du unngå å sette inn brukerdata med innerHTML?

📝Oppgave 5.3.8

Skriv JavaScript-kode som finner alle <li>-elementer på siden, og for hvert element som inneholder teksten "Viktig", legger til CSS-klassen "uthevet" og endrer tekstfargen til rød. Bruk querySelectorAll() og forEach().

Oppsummering

I dette kapittelet har du lært:

- DOM: representerer HTML-dokumentet som en trestruktur av objekter.
- Finne elementer: querySelector, querySelectorAll og getElementById.
- Endre innhold: textContent og innerHTML.
- Endre attributter og stiler: direkte via JavaScript.
- Opprette og fjerne elementer: bygge dynamisk innhold.

Noekkelbegreper


BegrepForklaring
DOMTrestruktur som representerer HTML-dokumentet
querySelectorFinner første element som matcher en selektor
textContentEgenskap 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.