Essayer de coder ← Retour aux sujets

Sélectionner et modifier

DOM

Le DOM est l'arbre des éléments de la page. JavaScript peut le lire et le modifier : changer un texte, une classe, un style, ajouter des éléments.

document.querySelector(".carte")
Premier élément qui correspond à un sélecteur CSS
document.querySelectorAll("li")
Tous les éléments qui correspondent (une liste)
document.getElementById("titre")
Un élément d'après son id
el.textContent = "Salut";
Change le texte (sans danger)
el.classList.add("actif")
Ajoute une classe CSS (aussi remove, toggle)
el.style.color = "red";
Style en ligne (préfère les classes)
dom.html
<h1 id="titre">Bonjour</h1>
<p class="note">Un paragraphe.</p>

<script>
  const titre = document.getElementById("titre");
  titre.textContent = "Bonjour NSI !";
  titre.classList.add("actif");

  document.querySelector(".note").style.color = "#2563eb";
</script>
Rendu
Le titre devient « Bonjour NSI ! » (avec la classe « actif ») et le paragraphe passe en bleu.

Créer et écouter

événements

On réagit à l'utilisateur avec des événements (clic, saisie, envoi de formulaire…) et on construit de nouveaux éléments avec createElement.

bouton.addEventListener("click", fn)
Appelle fn à chaque clic
champ.addEventListener("input", fn)
À chaque modification du champ
form.addEventListener("submit", (e) => e.preventDefault())
Empêche l'envoi réel du formulaire
const li = document.createElement("li");
Crée un élément (pas encore dans la page)
liste.append(li)
L'ajoute à la fin de la liste
el.remove()
Le retire de la page
taches.html
<input id="tache" placeholder="Nouvelle tâche">
<button id="ajouter">Ajouter</button>
<ul id="liste"></ul>

<script>
  const champ = document.getElementById("tache");
  const liste = document.getElementById("liste");

  document.getElementById("ajouter").addEventListener("click", () => {
    if (champ.value.trim() === "") return;
    const li = document.createElement("li");
    li.textContent = champ.value;
    liste.append(li);
    champ.value = "";
  });
</script>
Rendu
À chaque clic sur « Ajouter », le texte saisi devient une nouvelle ligne de la liste et le champ est vidé.

🎨 Le cours : faire vivre la page

Quand le navigateur lit un fichier HTML (voir Structure), il construit en mémoire un arbre d'objets : le DOM (*Document Object Model*). Chaque balise devient un nœud que JavaScript peut retrouver, modifier, supprimer ou créer. Dès que le DOM change, le navigateur redessine la page : c'est ce qui rend une page interactive.

Où placer le script

Un script ne peut agir que sur les éléments qui existent déjà quand il s'exécute. Place-le donc à la fin du <body>, ou dans le <head> avec l'attribut defer (<script src="app.js" defer></script>) qui retarde l'exécution jusqu'à ce que la page soit lue. Écrire le script dans un fichier séparé garde le HTML lisible.

Sélectionner des éléments

MéthodeRenvoie
document.getElementById("x")l'élément d'id="x", ou null
document.querySelector("css")le premier élément qui correspond à un sélecteur CSS (".carte", "nav a"), ou null
document.querySelectorAll("css")tous les éléments qui correspondent (une NodeList, qu'on parcourt avec forEach ou for…of)
el.closest("css")l'ancêtre le plus proche qui correspond (en remontant)
el.parentElement el.childrenle parent / la liste des enfants

Un sélecteur CSS marche donc partout (voir Sélecteurs). Garde l'élément dans une const pour ne pas le rechercher à chaque fois.

Lire et modifier le contenu

textContent lit ou remplace le texte d'un élément ; c'est la méthode sûre. innerHTML interprète le texte comme du HTML, ce qui est pratique pour insérer une structure mais dangereux avec une donnée venue de l'utilisateur (une balise <script> ou <img onerror=…> saisie dans un champ s'exécuterait : faille XSS). Pour les champs de formulaire, on lit et on écrit .value (toujours du texte), .checked pour une case à cocher. Les attributs : el.getAttribute("href"), el.setAttribute("href", …), ou directement el.href. Les données personnalisées data-niveau="3" se lisent avec el.dataset.niveau.

Classes et styles

Pour changer l'apparence, ajoute ou retire une classe (classList.add, remove, toggle, contains) et laisse le CSS s'en charger : la mise en forme reste dans la feuille de style, et on peut l'animer (voir Animations). el.style.couleurDeFond (propriétés CSS en camelCase) n'est à utiliser que pour une valeur calculée (une position, une largeur en pourcentage).

Créer, insérer et supprimer des éléments

document.createElement("li") fabrique un élément hors de la page. Il n'apparaît qu'une fois inséré : parent.append(el) (à la fin), prepend (au début), el.before(autre), el.after(autre). el.remove() le retire. Construire avec createElement et textContent est la méthode sûre pour des données qui ne sont pas de confiance.

Les événements

Un événement signale que quelque chose s'est produit. element.addEventListener(type, fonction) enregistre une fonction (un *callback*, voir Fonctions) appelée à chaque fois. Elle reçoit un objet event qui décrit l'événement : event.target (l'élément touché), event.key (la touche), event.preventDefault() (annule le comportement par défaut : suivre un lien, envoyer un formulaire).

ÉvénementSe produit quand…
clickon clique (ou on active au clavier) sur l'élément
inputle contenu d'un champ change (à chaque frappe)
changeune valeur est validée (sortie du champ, case cochée, option choisie)
submitun formulaire est envoyé
keydown keyupune touche est enfoncée / relâchée
mouseover mouseoutla souris entre / sort de l'élément
DOMContentLoadedle HTML est entièrement lu (sur document)
scroll resizela page défile / la fenêtre change de taille (sur window)

Les formulaires

Le schéma est toujours le même : écouter submit, appeler event.preventDefault(), lire les .value (convertir avec Number si besoin), calculer, afficher le résultat avec textContent. Le formulaire complet est expliqué dans Formulaires.

Bulles et délégation d'événements

Un événement remonte (« bulle ») de l'élément touché jusqu'à ses ancêtres. On en profite pour n'écrire qu'un seul écouteur sur le parent au lieu d'un par enfant : event.target.closest("li") retrouve l'élément cliqué. Cela marche aussi pour les éléments ajoutés plus tard.

delegation.html
<ul id="menu">
  <li data-page="accueil">Accueil</li>
  <li data-page="cours">Cours</li>
</ul>

<script>
  document.getElementById("menu").addEventListener("click", (event) => {
    const item = event.target.closest("li");
    if (item) console.log("page :", item.dataset.page);
  });
</script>
Console, après un clic sur « Cours »
page : cours

Garder des données : localStorage

localStorage conserve des textes dans le navigateur, même après fermeture de l'onglet (sessionStorage : jusqu'à sa fermeture). Seuls des textes s'y rangent : on passe par JSON pour un objet (voir Objets et JSON). Ces données restent sur l'appareil de l'utilisateur, ne sont pas chiffrées et ne doivent jamais contenir de mot de passe.

stockage.js
const prefs = { theme: "sombre", taille: 16 };
localStorage.setItem("prefs", JSON.stringify(prefs));

const lues = JSON.parse(localStorage.getItem("prefs"));
console.log(lues.theme);
Console (dans une vraie page)
sombre

Déboguer

  • console.log(element) affiche l'élément ; console.dir(element) ses propriétés ; console.table(tableau) un tableau lisible.
  • L'onglet Éléments des outils de développement (F12) montre le DOM en direct, et l'onglet Console les erreurs avec le numéro de ligne.
  • Un null inattendu (« Cannot read properties of null ») signifie presque toujours que le sélecteur ne trouve rien, ou que le script s'exécute avant que l'élément existe.

⚠️ Erreurs fréquentes

Un script exécuté avant l'élément

À éviter
faux.html
<script>
  document.getElementById("titre").textContent = "Salut";   // null : le h1 n'existe pas encore
</script>
<h1 id="titre"></h1>
Correct
correct.html
<h1 id="titre"></h1>
<script>
  document.getElementById("titre").textContent = "Salut";
</script>

Appeler la fonction au lieu de la passer

À éviter
faux.js
bouton.addEventListener("click", afficher());   // exécutée tout de suite
Correct
correct.js
bouton.addEventListener("click", afficher);     // exécutée à chaque clic

querySelectorAll n'est pas un tableau

Il renvoie une NodeList : forEach marche, mais pas map ni filter. Convertis : [...document.querySelectorAll("li")] ou Array.from(…).

Insérer du texte d'utilisateur avec innerHTML

À éviter
faux.js
commentaire.innerHTML = saisie;        // saisie peut contenir du code actif
Correct
correct.js
commentaire.textContent = saisie;      // traité comme du simple texte

Oublier preventDefault sur un formulaire

Sans event.preventDefault(), l'envoi recharge la page : le résultat disparaît aussitôt qu'il est affiché, et on croit que « rien ne se passe ».

Lire .value sans le convertir

champ.value est toujours un texte : champ.value + 1 donne "51" si le champ contient 5. Écris Number(champ.value) + 1.

Ajouter plusieurs fois le même écouteur

Un addEventListener placé dans une fonction appelée à chaque clic en ajoute un de plus à chaque appel : l'action se répète 2, 3, 4 fois. Enregistre l'écouteur une seule fois, au chargement.

Des éléments créés plus tard sans écouteur

Un écouteur posé sur les li existants ne concerne pas ceux qu'on ajoute ensuite. Utilise la délégation (un écouteur sur le parent).

📋 Aide-mémoire

  • Sélection : getElementById, querySelector (le premier), querySelectorAll (liste), closest.
  • Contenu : textContent (sûr), innerHTML (HTML, jamais avec un texte d'utilisateur), .value (texte), .dataset, getAttribute.
  • Style : classList.add / remove / toggle plutôt que el.style.
  • Création : createElement, append, prepend, before, after, remove.
  • addEventListener("click" | "input" | "submit" …, fonction) ; event.target, event.key, event.preventDefault() ; délégation avec closest.
  • Script en fin de body ou defer ; localStorage ne contient que du texte (JSON) ; F12 pour inspecter.