Lors de la session précédente, vous avez créé un micro-tracker avec :
Ce fonctionnement était volontairement simplifié, mais il avait plusieurs limites importantes.
Chaque compteur était défini “à la main” dans le JavaScript. Si on voulait ajouter un 4ᵉ compteur, il fallait :
Le code n’était pas scalable (pas adaptable à une interface plus grande).
La version précédente ne “lisait” pas réellement l’écran : elle ne faisait que mettre à jour des variables JavaScript avant de modifier l’interface
Résultat : Le JavaScript “connaissait” les valeurs, mais le navigateur ne les connaissait pas encore.
L’interface et la logique vivaient séparément.
Chaque action (+1, reset…) nécessitait du code dédié. Impossible de programmer correctement, certainemant pas sans :
querySelector() et closest()querySelectorAll() et NodeList (listes d’éléments HTML)Le code était long, répétitif, difficile à maintenir.
Cela nous amène au principe fondamental du développement web :
Séparer les rôles de chaque langage pour obtenir un code propre et adaptable.
Dans l’exercice actuel :
Chaque langage joue son rôle.
Parce qu’un designer moderne doit comprendre plus que l’apparence : il doit comprendre comment l’interface réagit.
Ce n’est pas apprendre à “coder”, c’est apprendre à penser en composants, à penser en interface interactive.
querySelector() et closest()À coller dans un fichier sandbox.html.
Pas de fichier JS au début : on manipule uniquement la console.
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Sandbox DOM</title>
<style>
body { font-family: sans-serif; padding: 1rem; }
section, article, div { border: 1px solid #ccc; padding: .5rem; margin-bottom: .5rem; }
.box { background: #f0f0f0; padding: .3rem; }
</style>
</head>
<body>
<h1>Sandbox DOM</h1>
<section id="zone-1">
<h2>Zone 1</h2>
<article>
<h3>Article A</h3>
<div class="box">
<button class="btn">Bouton A1</button>
</div>
</article>
</section>
<section id="zone-2">
<h2>Zone 2</h2>
<article>
<h3>Article B</h3>
<div class="box">
<button class="btn">Bouton B1</button>
<button class="btn special">Bouton B2</button>
</div>
</article>
</section>
</body>
</html>
querySelector() (console uniquement)Objectif : comprendre “chercher 1 élément dans le DOM”.
Dans la console :
document.querySelector('h2')
→ renvoie “Zone 1” (le premier h2)
document.querySelector('h3')
→ renvoie “Article A”
document.querySelector('.btn')
→ renvoie le premier bouton trouvé (Bouton A1)
document.querySelector('.special')
→ renvoie Bouton B2
let zone2 = document.querySelector('#zone-2');
zone2.querySelector('.btn')
→ cherche seulement dans Zone 2
closest()But : revenir du bouton vers son parent logique.
Dans la console :
let btnB2 = document.querySelector('.special');
btnB2.closest('section')
→ renvoie la section “Zone 2”
btnB2.closest('article')
→ renvoie l’article B
btnB2.closest('.box')
→ renvoie le div.box autour des boutons
Point à démontrer : closest = remonter dans l’arbre jusqu’au parent demandé.
Faites cliquer les étudiants n’importe où et les laisser tester en live.
querySelectorAll() et les tableaux (NodeList)Là, on introduit progressivement les listes d’éléments comme un “tableau”.
let allButtons = document.querySelectorAll('.btn');
allButtons
→ affiche une NodeList (ressemble à un tableau)
allButtons.length
→ nombre total de boutons
allButtons[0]
→ Bouton A1
allButtons[2]
→ Bouton B2 (selon l’ordre du DOM)
→ ?
allButtons[3]
Créer un fichier sandbox-dom.js et le relier.
console.log("Script chargé");
// On récupère tous les boutons
let allButtons = document.querySelectorAll('.btn');
// Boucle simple d’affichage
let i = 0;
let currentButton;
while (i < allButtons.length) {
currentButton = allButtons[i];
console.log("Bouton trouvé :", currentButton.textContent);
i = i + 1;
}
Changer leur texte pour X/Y, ou X est l’index du bouton dans la liste et Y la quantite totale de boutons
function colorAll() {
let items = document.querySelectorAll('.btn');
let i = 0;
while (i < items.length) {
items[i].classList.add('colorized');
i = i + 1;
}
}
Puis, appeler la fonction:
colorAll();
closest() + querySelectorAll() ensembledocument.addEventListener('click', function(e) {
if (e.target.classList.contains('btn')) {
let article = e.target.closest('article');
console.log("Tu as cliqué sur le bouton dans l’article :", article.querySelector('h3').textContent);
}
});
Après ces démonstrations vous :
✓ savez chercher 1 élément
✓ savez chercher plusieurs éléments
✓ savez remonter dans le DOM avec closest
✓ comprenez ce qu’est une NodeList
✓ savez parcourir des éléments avec while
✓ avez manipulé le DOM