Les 8: DOM selecteren
Home โ€บJavaScript-track โ€บLes 8

๐Ÿ” DOM selecteren

โฑ Geschatte leestijd: 20 minuten ยท 7 stappen

Tot nu toe schreef je JavaScript los van HTML. Vanaf deze les ga je de twee koppelen via de DOM. Je leert hoe je HTML-elementen vanuit JavaScript kunt vinden en uitlezen โ€” de eerste stap naar echte interactieve webpagina's.

1 Wat is de DOM?

Document Object Model

De DOM (Document Object Model) is een boomstructuur die de browser aanmaakt op basis van je HTML. Elk HTML-element wordt een node in die boom. JavaScript kan deze boom lezen en aanpassen โ€” zo wordt een statische pagina interactief.

DOM-boom (vereenvoudigd)
<!-- HTML die je schrijft -->
<html>
  <body>
    <h1 id="titel">Hallo wereld</h1>
    <p id="intro">Welkom!</p>
  </body>
</html>

<!--
DOM-boom:
  document
  โ””โ”€โ”€ html
      โ””โ”€โ”€ body
          โ”œโ”€โ”€ h1#titel  โ†’ "Hallo wereld"
          โ””โ”€โ”€ p#intro   โ†’ "Welkom!"
-->

Via het globale object document heb je toegang tot de hele boom. Alle DOM-methoden beginnen met document..

2 getElementById en querySelector

De twee belangrijkste selectiemethoden

getElementById('id') geeft รฉรฉn element terug op basis van zijn id-attribuut. querySelector('css-selector') is flexibeler: je gebruikt dezelfde CSS-selectors als in een stylesheet. querySelectorAll geeft een NodeList terug van alle matches.

Selecteren
// Op ID โ€” snel, direct
const titel = document.getElementById('titel');

// querySelector โ€” CSS-selector syntax
const titel2  = document.querySelector('#titel');      // id
const eerste  = document.querySelector('p');           // eerste <p>
const actief  = document.querySelector('.actief');     // klasse
const input   = document.querySelector('input[type="text"]'); // attribuut

// querySelectorAll โ€” alle matches als NodeList
const alleparagrafen = document.querySelectorAll('p');
console.log(alleparagrafen.length); // aantal <p>-elementen

// NodeList itereren
alleparagrafen.forEach(p => console.log(p.textContent));

๐Ÿ’ก Tip: Als een element niet bestaat, geeft getElementById en querySelector null terug. Controleer altijd of het element gevonden is voordat je er iets mee doet, anders krijg je een fout.

3 textContent vs innerHTML

Tekst uitlezen en aanpassen

.textContent leest of schrijft de puur tekstuele inhoud van een element โ€” HTML-tags worden niet verwerkt, wat het veilig maakt. .innerHTML leest of schrijft de HTML-inhoud inclusief tags, maar wees voorzichtig: het verwerkt HTML, waardoor een aanvaller schadelijke scripts kan injecteren (XSS) als je gebruikersinvoer gebruikt.

textContent vs innerHTML
const el = document.querySelector('#bericht');

// textContent โ€” veilig, alleen tekst
console.log(el.textContent); // leest de tekst

el.textContent = 'Nieuwe tekst'; // schrijft tekst
// HTML-tags worden als gewone tekst behandeld:
el.textContent = '<b>vet</b>'; // toont letterlijk <b>vet</b>

// innerHTML โ€” verwerkt HTML
el.innerHTML = '<b>vet</b>'; // toont: vet (vetgedrukt)

// GEVAAR โ€” gebruik dit NOOIT met gebruikersinvoer:
// el.innerHTML = gebruikerInput; // XSS-risico!

4 getAttribute en setAttribute

Met .getAttribute() lees je elk HTML-attribuut uit, met .setAttribute() stel je het in. Dit werkt voor elk attribuut: href, src, class, data-*, enzovoort.

getAttribute en setAttribute
const link = document.querySelector('a');

// Lezen
console.log(link.getAttribute('href'));  // bijv. "https://example.com"

// Schrijven
link.setAttribute('href', 'https://mbo-sd.com');
link.setAttribute('target', '_blank');

// Verwijderen
link.removeAttribute('target');

// Handige kortere notatie voor standaard-attributen
const img = document.querySelector('img');
console.log(img.src);   // zelfde als getAttribute('src')
img.alt = 'Nieuw alt';  // zelfde als setAttribute('alt', ...)

5 Oefening 1: Elementen uitlezen

Opdracht:

De pagina bevat drie elementen met IDs. Schrijf JavaScript om de textContent van elk element te loggen in de console.

โœ“ Gebruik getElementById of querySelector

โœ“ Log de textContent van alle drie elementen

editor
Live preview

6 Oefening 2: Inhoud wijzigen

Opdracht:

De pagina heeft een koptekst en een alinea. Schrijf JavaScript om de textContent van de koptekst te wijzigen naar "Gewijzigde Titel" en de alinea naar "Dit is gewijzigd door JavaScript."

โœ“ Gebruik .textContent = om de inhoud te overschrijven

โœ“ De nieuwe teksten moeten exact overeenkomen

editor
Live preview

7 Eindopdracht: Samenvatting samenstellen

Combineer alles:

De pagina heeft elementen met id="naam", id="leeftijd", id="stad" en id="samenvatting". Lees de tekstinhoud van de eerste drie uit en stel de samenvatting in met een template literal die alle drie combineert.

โœ“ Minstens 3 aanroepen van querySelector of getElementById

โœ“ Template literal met backticks gebruikt

โœ“ .textContent = gebruikt om samenvatting in te stellen

editor
Live preview
๐Ÿ“„ Volledig voorbeeld: dom-selecteren.html
<!DOCTYPE html>
<html lang="nl">
<head>
  <meta charset="UTF-8">
  <title>DOM selecteren</title>
</head>
<body>
  <h1 id="titel">Hallo wereld</h1>
  <p class="intro">Eerste alinea.</p>
  <p class="intro">Tweede alinea.</p>
  <a href="https://example.com">Link</a>

  <p id="naam">Lena</p>
  <p id="leeftijd">22</p>
  <p id="stad">Utrecht</p>
  <p id="samenvatting"></p>

  <script>
  // getElementById
  const titel = document.getElementById('titel');
  console.log(titel.textContent); // Hallo wereld

  // querySelector
  const eersteIntro = document.querySelector('.intro');
  console.log(eersteIntro.textContent); // Eerste alinea.

  // querySelectorAll
  const alleIntros = document.querySelectorAll('.intro');
  alleIntros.forEach(p => console.log(p.textContent));

  // getAttribute / setAttribute
  const link = document.querySelector('a');
  console.log(link.getAttribute('href'));
  link.setAttribute('target', '_blank');

  // textContent schrijven
  const naam      = document.getElementById('naam').textContent;
  const leeftijd  = document.getElementById('leeftijd').textContent;
  const stad      = document.getElementById('stad').textContent;
  const samen     = document.getElementById('samenvatting');
  samen.textContent = `${naam} is ${leeftijd} jaar en woont in ${stad}.`;
  </script>
</body>
</html>