Manipuler le DOM en JavaScript
Sélectionner, modifier, créer et supprimer des éléments HTML avec JavaScript
C'est quoi le DOM ?
Le DOM est la représentation en arbre de ta page HTML. Chaque balise HTML devient un nœud (node) que JavaScript peut lire et modifier. Quand tu changes le DOM, le navigateur met à jour l'affichage en temps réel.
id=« title »>Bonjour
class=« text »>Un paragraphe
// Le DOM transforme ça en arbre :
// document
// └── html
// └── body
// ├── h1#title → « Bonjour »
// └── p.text → « Un paragraphe »
document est le point d'entrée : c'est l'objet qui représente toute la page. Toutes les manipulations du DOM commencent par document.
Sélectionner des éléments
const title = document.querySelector(« #title »); // par id
const text = document.querySelector(« .text »); // par class
const link = document.querySelector(« a[href='#'] »); // par attribut
const item = document.querySelector(« nav > ul > li »); // sélecteur CSS
// querySelectorAll — retourne TOUS les éléments (NodeList)
const paragraphs = document.querySelectorAll(« p »);
const cards = document.querySelectorAll(« .card »);
// Itérer sur les résultats
cards.forEach(card => );
| Méthode | Retourne | Usage recommandé |
|---|---|---|
| querySelector(css) | 1 élément ou null | ✅ Toujours — le plus flexible |
| querySelectorAll(css) | NodeList (statique) | ✅ Toujours — le plus flexible |
| getElementById(id) | 1 élément ou null | OK — légèrement plus rapide |
| getElementsByClassName(c) | HTMLCollection (live) | ⚠️ Éviter — collection live |
| getElementsByTagName(t) | HTMLCollection (live) | ⚠️ Éviter — collection live |
En 2026, utilise querySelector et querySelectorAll pour tout. Ils acceptent n'importe quel sélecteur CSS et retournent des collections statiques (plus prévisibles).
Modifier le contenu
// textContent — texte brut (sécurisé, rapide)
el.textContent = « Nouveau titre »;
console.log(el.textContent); // « Nouveau titre »
// innerHTML — HTML complet (⚠️ attention aux failles XSS)
el.innerHTML = « Titre en gras »;
// Attributs
const link = document.querySelector(« a »);
link.getAttribute(« href »); // lire
link.setAttribute(« href », « https://example.com »); // écrire
link.removeAttribute(« target »); // supprimer
link.hasAttribute(« rel »); // vérifier
// Raccourcis pour les attributs courants
link.href = « https://example.com »;
link.id = « main-link »;
// Data attributes
//
const div = document.querySelector(« [data-user-id] »);
div.dataset.userId; // « 42 » (camelCase automatique)
div.dataset.role; // « admin »
div.dataset.active = « true »; // ajouter data-active= »true »
⚠️ innerHTML exécute le HTML injecté. Ne jamais y mettre du contenu utilisateur directement — risque d'attaque XSS. Utilise textContent pour le texte pur.
Modifier les styles
// style inline (propriétés en camelCase)
el.style.backgroundColor = « #2563eb »;
el.style.padding = « 16px »;
el.style.borderRadius = « 8px »;
el.style.display = « none »; // masquer
el.style.display = « »; // revenir au CSS par défaut
// Modifier une variable CSS
document.documentElement.style.setProperty(« –primary », « #7c3aed »);
// Lire le style calculé (inclut le CSS)
const computed = getComputedStyle(el);
console.log(computed.width); // « 320px »
Évite de modifier les styles en JS quand tu peux le faire avec des classes CSS. el.style est utile pour les valeurs dynamiques (position, taille calculée). Pour le reste, toggle une classe.
Manipuler les classes CSS
el.classList.add(« active »); // ajouter une classe
el.classList.add(« dark », « rounded »); // plusieurs à la fois
el.classList.remove(« active »); // supprimer
el.classList.toggle(« visible »); // ajouter si absente, supprimer si présente
el.classList.contains(« active »); // vérifier → true/false
el.classList.replace(« old », « new »); // remplacer
// Toggle conditionnel
el.classList.toggle(« dark », isDarkMode); // ajoute si true, retire si false
// Pattern courant : menu hamburger
const btn = document.querySelector(« .menu-btn »);
const nav = document.querySelector(« .nav »);
btn.addEventListener(« click », () => );
Créer et insérer des éléments
const card = document.createElement(« div »);
card.className = « card »;
card.textContent = « Nouvelle carte »;
// L'insérer dans le DOM
document.querySelector(« .container »).appendChild(card);
// Insertion plus précise avec insertAdjacentHTML
const list = document.querySelector(« ul »);
list.insertAdjacentHTML(« beforeend », `
`);
list.insertAdjacentHTML(« afterbegin », `
`);
| Position | Insère |
|---|---|
| « beforebegin » | Avant l'élément (frère précédent) |
| « afterbegin » | Premier enfant de l'élément |
| « beforeend » | Dernier enfant de l'élément |
| « afterend » | Après l'élément (frère suivant) |
const ul = document.querySelector(« #user-list »);
// Méthode 1 : innerHTML (simple mais attention au XSS)
ul.innerHTML = users.map(u => `
`).join(« »);
// Méthode 2 : fragment (performant pour beaucoup d'éléments)
const fragment = document.createDocumentFragment();
users.forEach(u => );
ul.appendChild(fragment); // un seul reflow
DocumentFragment insère tous les éléments en une seule opération DOM. Plus performant que d'ajouter les éléments un par un (un seul reflow au lieu de N).
Supprimer des éléments
// Méthode moderne
el.remove(); // supprime l'élément du DOM
// Supprimer un enfant spécifique
const parent = document.querySelector(« .container »);
parent.removeChild(el);
// Vider tous les enfants
parent.innerHTML = « »;
// ou (plus propre) :
parent.replaceChildren();
// Remplacer un élément
const newEl = document.createElement(« div »);
newEl.textContent = « Remplacement »;
el.replaceWith(newEl);
Traverser le DOM
// Parent
el.parentElement; // parent direct
el.closest(« .container »); // ancêtre le plus proche qui matche
// Enfants
el.children; // HTMLCollection des enfants (éléments uniquement)
el.firstElementChild; // premier enfant élément
el.lastElementChild; // dernier enfant élément
// Frères et sœurs (siblings)
el.previousElementSibling; // frère précédent
el.nextElementSibling; // frère suivant
| Propriété | Direction | Retourne |
|---|---|---|
| parentElement | ↑ Haut | Le parent direct |
| closest(css) | ↑ Haut (récursif) | Premier ancêtre qui matche |
| children | ↓ Bas | Tous les enfants (éléments) |
| firstElementChild | ↓ Bas | Premier enfant |
| previousElementSibling | ← Gauche | Frère précédent |
| nextElementSibling | → Droite | Frère suivant |
closest() est extrêmement utile avec la délégation d'événements. Quand un clic arrive sur un enfant, e.target.closest(« .card ») retrouve la carte parente. Voir notre fiche addEventListener.
Questions fréquentes
🎯 addEventListener
🔤 let, const, var
🌐 Fetch API
📄 JSON
🔁 Boucles
⚡ Cours JavaScript complet
🏠 Hub Programmation
Manipuler le DOM en JavaScript — Guide complet
Référence : MDN DOM
