TP 1 · Manipulation du DOM
Le changeur de thème
Objectif : un bouton qui fait basculer la page entre mode clair et mode sombre. Derrière ce petit effet se cache le trio de base de tout site interactif : sélectionner un élément, écouter un événement, modifier la page.
Comment travailler
Chaque exercice a son propre aperçu : une vraie
petite page qui contient le bouton #toggle-theme-btn.
▶ Exécuter lance votre code dans cet aperçu (vous pouvez
ensuite cliquer sur le bouton), ✔ Vérifier le teste
automatiquement et compte pour votre certificat.
1. Le DOM : la page vue par JavaScript
Quand le navigateur lit votre HTML, il construit en mémoire un
arbre d'objets : le DOM (Document Object
Model). Chaque balise devient un objet que JavaScript peut
retrouver, lire et modifier. Tout part de l'objet
document.
document pour atteindre le bouton.2. Sélectionner un élément
Pour agir sur un élément, on le range d'abord dans une variable :
HTML
<body>
<button id="toggle-theme-btn">
Activer le Mode Sombre
</button>
</body>
JavaScript
// par son id (unique), SANS le #
const themeButton =
document.getElementById("toggle-theme-btn");
// par un sélecteur CSS, comme en CSS
const bodyElement =
document.querySelector("body");
getElementById("id")
Cherche l'élément qui porte cet id. Rapide et sans ambiguïté, mais uniquement par id : on écrit le nom sans dièse.
querySelector("sélecteur")
Accepte n'importe quel sélecteur CSS ("body", "#toggle-theme-btn", ".carte"…) et renvoie le premier élément trouvé.
Quand la sélection renvoie null
Si l'élément n'existe pas (faute de frappe, # en trop
dans getElementById, ou script exécuté
avant que le HTML soit chargé), on obtient
null, et la ligne suivante plante avec
« Cannot read properties of null ». C'est pourquoi on lie
script.js juste avant </body>.
3. Écouter un événement
Un événement, c'est quelque chose qui arrive sur la page : un clic, une touche, le survol de la souris… On demande à un élément d'appeler une fonction quand l'événement se produit :
themeButton.addEventListener("click", function () {
// ce code attend le clic : il ne s'exécute pas tout de suite
});
La fonction passée en second argument s'appelle un callback (fonction de rappel) : on la donne au navigateur, qui la rappellera au bon moment, à chaque clic.
Piège : les parenthèses en trop
Avec une fonction nommée, on écrit
addEventListener("click", basculer) et
pas basculer() : avec les parenthèses,
la fonction s'exécute immédiatement, une seule fois, au chargement,
et c'est son résultat (undefined) qui est confié au
bouton.
4. Ajouter, retirer, basculer une classe
Plutôt que de changer les couleurs une par une en JavaScript, on
laisse le CSS faire son travail : une règle body.dark-theme
décrit le mode sombre, et JavaScript se contente d'ajouter ou de
retirer la classe.
CSS (déjà en place)
body.dark-theme {
background: #12141c;
color: #e7e9f2;
}
JavaScript
bodyElement.classList.add("dark-theme");
bodyElement.classList.remove("dark-theme");
bodyElement.classList.toggle("dark-theme");
bodyElement.classList.contains("dark-theme");
toggle inverse la présence de la classe
: absente, il l'ajoute ; présente, il la retire. Un seul appel suffit
donc pour faire un interrupteur. contains ne modifie
rien : il répond true ou false.
Le body a déjà la classe dark-theme. Que fait
classList.toggle("dark-theme") ?
toggle inverse l'état : présente → retirée. C'est
l'équivalent d'un if (contains) remove else add, en une
ligne.
5. Modifier le texte selon l'état
Dernière étape : le bouton doit toujours proposer l'autre mode. Après la bascule, on regarde l'état de la page et on choisit le texte :
Pseudo-code
AU CLIC SUR le bouton :
basculer la classe dark-theme
SI le body a dark-theme ALORS
texte ← "Activer le Mode Clair"
SINON
texte ← "Activer le Mode Sombre"
FIN SI
À utiliser
bodyElement.classList.contains("dark-theme")
// → true ou false
themeButton.textContent = "…";
// remplace le texte du bouton
À retenir
- Sélectionner :
getElementById("id")(sans #) ouquerySelector("sélecteur CSS"). Unnullsignale un élément introuvable. - Écouter :
élément.addEventListener("click", fonction); la fonction attend l'événement. - Modifier :
classList.toggle / add / remove / containspour le style,textContentpour le texte.