Wat is DOM manipulatie?

Met DOM manipulatie kun je HTML-elementen aanmaken, aanpassen en verwijderen via JavaScript — zonder de pagina te herladen.

Twee manieren om elementen toe te voegen:
  • innerHTML — schrijf HTML als string. Snel, maar overschrijft bestaande inhoud.
  • createElement — maak een echt element aan. Meer controle, voeg toe zonder te overschrijven.
// innerHTML: overschrijft alles wat er al stond
const lijst = document.querySelector('#mijn-lijst');
lijst.innerHTML = '<li>Item 1</li><li>Item 2</li>';

// createElement: voegt toe aan bestaande inhoud
const nieuwItem = document.createElement('li');
nieuwItem.textContent = 'Item 3';
lijst.appendChild(nieuwItem);

createElement()

Met createElement() maak je een nieuw HTML-element aan. Je geeft de tagnaam mee als string.

// Maak een nieuw <li> element aan
const nieuwItem = document.createElement('li');

// Maak een nieuw <p> element aan
const nieuweParagraaf = document.createElement('p');

// Maak een nieuw <button> element aan
const nieuweKnop = document.createElement('button');
Een aangemaakt element is nog niet zichtbaar op de pagina. Je moet het nog toevoegen met appendChild().

Tekst toevoegen aan een element

Nadat je een element hebt aangemaakt, voeg je tekst toe met textContent of innerHTML.

const nieuwItem = document.createElement('li');

// Tekst toevoegen (aanbevolen voor platte tekst):
nieuwItem.textContent = 'Nieuw taak item';

// HTML toevoegen (als je opmaak wilt):
nieuwItem.innerHTML = '<strong>Belangrijk item</strong>';
  • textContent — veilig voor platte tekst, geen HTML parsing
  • innerHTML — gebruik alleen als je ook HTML-tags wilt toevoegen

Andere eigenschappen instellen

const knop = document.createElement('button');
knop.textContent = 'Verwijder';

// CSS klasse toevoegen
knop.className = 'verwijder-knop';

// ID instellen
knop.id = 'mijn-knop';

// Data-attribuut instellen
knop.dataset.index = 3;

appendChild()

Met appendChild() voeg je een aangemaakt element toe aan een bestaand element in de DOM. Het nieuwe element wordt als laatste kind toegevoegd.

// HTML:
// <ul id="taken-lijst"></ul>

const lijst = document.querySelector('#taken-lijst');

const nieuwItem = document.createElement('li');
nieuwItem.textContent = 'Boodschappen doen';

lijst.appendChild(nieuwItem);

// Resultaat:
// <ul id="taken-lijst">
//   <li>Boodschappen doen</li>
// </ul>

Meerdere elementen toevoegen

const lijst = document.querySelector('#taken-lijst');
const taken = ['Boodschappen', 'Sporten', 'Lezen'];

for (let taak of taken) {
  const item = document.createElement('li');
  item.textContent = taak;
  lijst.appendChild(item);
}

Geneste elementen

Je kunt elementen ook aan elkaar koppelen voordat je ze aan de pagina toevoegt.

const kaart = document.createElement('article');

const titel = document.createElement('h2');
titel.textContent = 'Mijn kaartje';

const tekst = document.createElement('p');
tekst.textContent = 'Dit is de inhoud van het kaartje.';

// Voeg de kinderen toe aan de kaart
kaart.appendChild(titel);
kaart.appendChild(tekst);

// Voeg de kaart toe aan de pagina
document.querySelector('#container').appendChild(kaart);

Elementen verwijderen

Er zijn twee manieren om een element te verwijderen uit de DOM.

element.remove() — eenvoudigst

const item = document.querySelector('#te-verwijderen');
item.remove();

removeChild() — via de parent

const lijst = document.querySelector('#taken-lijst');
const eersteItem = lijst.querySelector('li');

lijst.removeChild(eersteItem);
  • element.remove() — gebruik dit als je het element zelf hebt
  • removeChild() — gebruik dit als je via de parent werkt

Verwijderen via een event listener

Vaak wil je een element verwijderen als er op een knop geklikt wordt. Je kunt this of event.target gebruiken om te weten welk element geklikt is.

const item = document.createElement('li');
item.textContent = 'Klikbaar item';

const verwijderKnop = document.createElement('button');
verwijderKnop.textContent = 'Verwijder';

// Bij klik: verwijder het hele li-element
verwijderKnop.addEventListener('click', () => {
  item.remove();
});

item.appendChild(verwijderKnop);
document.querySelector('#lijst').appendChild(item);

data-attributen en dataset

Met data-* attributen sla je extra informatie op in een HTML-element. Via JavaScript lees je die uit met dataset.

Data-attribuut instellen in HTML

<button data-id="42" data-actie="verwijder">Verwijder</button>
<li data-index="0">Eerste item</li>
<article data-categorie="tech">Artikel</article>

Data-attribuut uitlezen in JavaScript

const knop = document.querySelector('button');

console.log(knop.dataset.id);     // "42"
console.log(knop.dataset.actie);  // "verwijder"
Let op de naamgeving:
  • In HTML schrijf je data-mijn-waarde (met koppelteken)
  • In JavaScript wordt dat dataset.mijnWaarde (camelCase)

Data-attribuut instellen via JavaScript

const item = document.createElement('li');
item.textContent = 'Nieuw item';
item.dataset.index = 3;

console.log(item.dataset.index); // "3"

Praktisch voorbeeld — verwijderen op basis van index

const items = ['Appel', 'Banaan', 'Druif'];
const lijst = document.querySelector('#fruit-lijst');

const toonItems = () => {
  lijst.innerHTML = '';

  items.forEach((item, index) => {
    const li = document.createElement('li');
    li.textContent = item;

    // Sla de index op als data-attribuut
    li.dataset.index = index;

    const knop = document.createElement('button');
    knop.textContent = 'Verwijder';
    knop.addEventListener('click', (e) => {
      // Lees de index uit het li-element
      const index = parseInt(li.dataset.index);
      items.splice(index, 1);
      toonItems(); // herrender
    });

    li.appendChild(knop);
    lijst.appendChild(li);
  });
};

toonItems();
Tip: dataset is handig bij event delegation. Je kunt op een container één listener zetten en via e.target.dataset achterhalen op welk specifiek item geklikt is.

querySelectorAll()

querySelectorAll() geeft alle overeenkomende elementen terug als een NodeList. Je kunt er doorheen loopen met for...of of forEach().

// Geeft alle <li> elementen terug
const alleItems = document.querySelectorAll('li');

// Door alle items loopen met for...of
for (let item of alleItems) {
  console.log(item.textContent);
}

// Of met forEach:
alleItems.forEach(item => {
  console.log(item.textContent);
});
querySelector vs querySelectorAll
  • querySelector() — geeft het eerste overeenkomend element terug
  • querySelectorAll() — geeft alle overeenkomende elementen terug als NodeList

Klasse toevoegen aan alle elementen

const alleKnoppen = document.querySelectorAll('button');

for (let knop of alleKnoppen) {
  knop.classList.add('actief');
}

Event listener op alle elementen

const alleItems = document.querySelectorAll('.lijst-item');

for (let item of alleItems) {
  item.addEventListener('click', () => {
    item.classList.toggle('geselecteerd');
  });
}

Compleet voorbeeld — takenlijst

Dit voorbeeld combineert createElement, appendChild en remove() in een werkende takenlijst.

HTML

<main>
  <section>
    <input type="text" id="taak-input" placeholder="Nieuwe taak...">
    <button id="voeg-toe">Toevoegen</button>
  </section>
  <ul id="taken-lijst"></ul>
</main>

JavaScript

const input = document.querySelector('#taak-input');
const knop = document.querySelector('#voeg-toe');
const lijst = document.querySelector('#taken-lijst');

knop.addEventListener('click', () => {
  const tekst = input.value.trim();

  // Doe niets als de invoer leeg is
  if (tekst === '') return;

  // Maak een nieuw li-element aan
  const item = document.createElement('li');
  item.textContent = tekst;

  // Maak een verwijderknop aan
  const verwijderKnop = document.createElement('button');
  verwijderKnop.textContent = 'Verwijder';
  verwijderKnop.addEventListener('click', () => {
    item.remove();
  });

  // Voeg de knop toe aan het li-element
  item.appendChild(verwijderKnop);

  // Voeg het li-element toe aan de lijst
  lijst.appendChild(item);

  // Maak de input leeg
  input.value = '';
});

Samenvatting

Methode Wat doet het Voorbeeld
createElement() Nieuw element aanmaken document.createElement('li')
textContent Tekst in element zetten element.textContent = 'tekst'
innerHTML HTML in element zetten element.innerHTML = '<strong>vet</strong>'
appendChild() Element toevoegen als laatste kind lijst.appendChild(item)
element.remove() Element verwijderen item.remove()
removeChild() Kind verwijderen via parent lijst.removeChild(item)
querySelectorAll() Alle overeenkomende elementen ophalen document.querySelectorAll('li')
element.dataset data-* attributen lezen en schrijven knop.dataset.index

createElement vs innerHTML

Gebruik createElement als je aan bestaande inhoud wil toevoegen. innerHTML overschrijft alles.

Altijd appendChild

Een element is pas zichtbaar als je het toevoegt met appendChild.

textContent is veiliger

Gebruik textContent voor platte tekst. innerHTML alleen als je echt HTML-tags nodig hebt.

remove() is het eenvoudigst

Gebruik element.remove() als je het element zelf hebt. Dat is korter dan removeChild().