From ceceb1865ffd88e5d401f5dd474f0f9a458b7125 Mon Sep 17 00:00:00 2001 From: matthieureynier Date: Mon, 22 Jun 2026 09:24:49 +0200 Subject: [PATCH] Rattrapage JS services (mode indices, sans solution): conditions, tableaux/boucles, filter, localStorage, classList, setInterval, fetch, composant navbar Co-Authored-By: Claude Opus 4.8 (1M context) --- PROCHAINE_ETAPE_services_2.md | 200 ++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 PROCHAINE_ETAPE_services_2.md diff --git a/PROCHAINE_ETAPE_services_2.md b/PROCHAINE_ETAPE_services_2.md new file mode 100644 index 0000000..4da4a8e --- /dev/null +++ b/PROCHAINE_ETAPE_services_2.md @@ -0,0 +1,200 @@ +# 🧗 Rattrapage JavaScript — page services + +Salut Guillaume ! 👋 + +Tu as ratĂ© une journĂ©e, ce guide est lĂ  pour rattraper. Il couvre tout ce que le projet a avancĂ© cĂŽtĂ© JavaScript, **dans l'ordre**, sur **ta** page services (le simulateur, le tableau des services, le formulaire de suggestions). + +> ⚠ **Ce guide est diffĂ©rent des prĂ©cĂ©dents : il ne donne PAS le code tout fait.** +> Pour chaque exo tu as : un **🎯 objectif**, des **🔍 pistes** (quoi chercher, quels mots-clĂ©s, les piĂšges), et un **✅ test**. À toi d'Ă©crire le code. C'est en cherchant que ça rentre — et tu retiendras dix fois mieux qu'en copiant-collant. +> +> 🔎 Ton meilleur rĂ©flexe : taper dans Google **« MDN » + le nom de la chose** (ex. `MDN addEventListener`). MDN, c'est la doc de rĂ©fĂ©rence du web, en français, avec des exemples. + +--- + +## đŸ©č Avant de continuer : 3 choses Ă  revoir dans ton `devis.js` + +Tu as dĂ©jĂ  bien attaquĂ© le simulateur. Trois petits points Ă  corriger toi-mĂȘme (cherche, ne devine pas) : + +1. Dans ton HTML, ta textarea a `row="6"`. Regarde bien l'attribut : il existe au **pluriel**. Lequel est le bon ? (cherche `MDN textarea rows`). +2. Ton blocage Ă  100 vĂ©hicules : tu ajoutes 1, tu **affiches**, *puis* tu testes `> 99`. Dans quel ordre faudrait-il faire pour ne jamais afficher 100 une fraction de seconde ? (indice : teste **avant** d'afficher). +3. Tu as une fonction `mettreAJourTOTAL` et une variable `totalargent` qui ne servent pas vraiment (le total affichĂ© est toujours 0). Demande-toi : *d'oĂč devrait venir le total ?* (indice : il se **calcule** Ă  partir de `nbVehicules`, il ne se stocke pas dans une variable Ă  part). + +> 💡 RĂšgle gĂ©nĂ©rale que tu retrouveras partout : une valeur qui **se dĂ©duit** d'une autre (le total se dĂ©duit du nombre de vĂ©hicules) ne se **stocke** pas — on la **recalcule** au moment de l'afficher. + +--- + +# 🟱 Étape 1 — Les conditions (`if` / `else`) + +## đŸ§Ș Exo 1 — Singulier / pluriel dans le simulateur + +**🎯 Objectif :** quand il y a **1** vĂ©hicule, afficher « 1 vĂ©hicule » ; Ă  partir de 2, « N vĂ©hicules ». + +**🔍 Pistes :** +- La structure Ă  chercher : `if (condition) { ... } else { ... }` → cherche `MDN if else`. +- Pour comparer deux valeurs : l'opĂ©rateur d'Ă©galitĂ©. Attention, en JS **`=` et `===` ne font pas la mĂȘme chose** → cherche `difference == === javascript`. Dans un `if`, c'est presque toujours le triple. +- OĂč mettre ce code ? LĂ  oĂč tu mets dĂ©jĂ  Ă  jour l'affichage du nombre. + +**✅ Test :** descends Ă  1 → « vĂ©hicule » ; monte Ă  2+ → « vĂ©hicules ». + +--- + +# 🟱 Étape 2 — RĂ©agir Ă  la saisie et Ă  l'envoi + +## đŸ§Ș Exo 2 — Un compteur de caractĂšres sur le formulaire de suggestions + +**🎯 Objectif :** sous ta textarea, afficher « Il vous reste X caractĂšres » qui se met Ă  jour **Ă  chaque frappe** (ta limite est `maxlength="500"`). + +**🔍 Pistes :** +- Il te faut un endroit oĂč afficher le nombre : ajoute un `` avec un `id` dans ton HTML. +- L'Ă©vĂ©nement qui se dĂ©clenche Ă  chaque frappe dans un champ → cherche `MDN input event` (ce n'est pas `"click"`). +- Pour savoir combien de caractĂšres ont Ă©tĂ© tapĂ©s : sur un champ, `.value` donne le texte, et il existe une propriĂ©tĂ© qui donne sa **longueur** (la mĂȘme que pour compter les Ă©lĂ©ments d'une liste) → cherche `javascript string length`. +- Le reste = 500 moins ce nombre. + +**✅ Test :** tape du texte → le nombre descend (499, 498
) et s'arrĂȘte Ă  0. + +**Bonus :** passe le compteur en rouge sous 50 caractĂšres → cherche `element.style.color` et l'opĂ©rateur ternaire `condition ? ... : ...`. + +## đŸ§Ș Exo 3 — EmpĂȘcher l'envoi d'un message vide + +**🎯 Objectif :** si on clique « Envoyer » avec une suggestion vide, bloquer l'envoi et afficher un message. + +**🔍 Pistes :** +- L'Ă©vĂ©nement dĂ©clenchĂ© quand un formulaire est envoyĂ© → cherche `MDN form submit event`. +- Pour **annuler** l'envoi par dĂ©faut → cherche `preventDefault`. +- Pour considĂ©rer « que des espaces » comme vide → cherche `javascript trim`. +- Afficher un message rapide → la fonction `alert(...)`. + +**✅ Test :** envoi Ă  vide → message + pas de rechargement. Avec du texte → ça passe. + +--- + +# 🟡 Étape 3 — Les tableaux et les boucles (le gros morceau) + +Jusqu'ici tes variables contiennent **une** valeur. Pour une **liste**, il y a les tableaux. C'est la base de presque tout. + +## đŸ§Ș Exo 4 — DĂ©crire tes services dans un tableau d'objets + +**🎯 Objectif :** au lieu d'avoir tes 4 services Ă©crits « en dur » dans le ``, range-les dans une **liste** en JavaScript. + +**🔍 Pistes :** +- Une **liste** s'Ă©crit avec des crochets `[ ]` → cherche `javascript array`. +- Chaque service a plusieurs infos (nom, description, prix) : ça, c'est un **objet** `{ }` avec des Ă©tiquettes → cherche `javascript object`. +- Combine les deux : une liste d'objets `[ { ... }, { ... } ]`. +- Pour parcourir la liste et tout afficher dans la console → cherche `javascript for of`. + +**✅ Test :** un `console.log` dans la boucle affiche tes 4 services, un par ligne. + +## đŸ§Ș Exo 5 — GĂ©nĂ©rer les lignes du tableau automatiquement + +**🎯 Objectif :** que les lignes `` de ton tableau soient **fabriquĂ©es par le JS** Ă  partir de la liste de l'exo 4. Ajouter un service = juste ajouter un objet Ă  la liste. + +**🔍 Pistes :** +- Vide le corps de ton tableau dans le HTML et donne-lui un `id` (garde l'en-tĂȘte ``). Cherche `html tbody`. +- Deux approches existent, regarde les deux et choisis : + - assembler du texte HTML et l'injecter → cherche `innerHTML` et `template literals` (les accents graves `` ` `` avec `${...}`) ; + - fabriquer chaque Ă©lĂ©ment proprement → cherche `document.createElement` et `append`. +- Une boucle parcourt la liste et ajoute une ligne par service. + +**✅ Test :** le tableau s'affiche comme avant. Ajoute un 5ᔉ service dans la liste → la ligne apparaĂźt sans toucher au HTML. + +> 💡 Tu viens de toucher au principe des sites modernes : **les donnĂ©es d'un cĂŽtĂ©, l'affichage de l'autre**. On change les donnĂ©es, l'affichage suit. + +## đŸ§Ș Exo 6 — Une barre de recherche qui filtre les services + +**🎯 Objectif :** un champ oĂč l'on tape, et le tableau ne garde que les services dont le nom contient le texte. + +**🔍 Pistes :** +- Mets ton « affichage du tableau » dans une **fonction** que tu peux rappeler avec une liste diffĂ©rente. +- Pour ne garder que certains Ă©lĂ©ments d'une liste → cherche `MDN Array filter`. +- Pour ignorer les majuscules → cherche `toLowerCase`, et pour tester « contient » → cherche `string includes`. +- À chaque frappe (`input`), filtre puis rĂ©-affiche. + +**✅ Test :** tape « gĂ©o » → seul le service de gĂ©olocalisation reste ; efface → tout revient. + +--- + +# 🟡 Étape 4 — Donner une mĂ©moire Ă  la page (`localStorage`) + +## đŸ§Ș Exo 7 — Se souvenir du nombre de vĂ©hicules choisi + +**🎯 Objectif :** si on rĂšgle le simulateur sur 12 vĂ©hicules et qu'on recharge la page, il doit revenir Ă  **12**, pas Ă  1. + +**🔍 Pistes :** +- Le petit coffre-fort du navigateur qui survit au rechargement → cherche `MDN localStorage` (`setItem` pour ranger, `getItem` pour relire). +- Sauvegarde Ă  chaque changement ; relis au chargement de la page. +- ⚠ **PiĂšge classique :** ce qui sort de `localStorage` est toujours du **texte**, pas un nombre. `"12" + 1` donne `"121"`, pas `13` ! Cherche `parseInt javascript` pour reconvertir en nombre. + +**✅ Test :** rĂšgle un nombre, recharge (F5) → le simulateur repart sur ce nombre. + +--- + +# 🟠 Étape 5 — Le style dynamique et le temps rĂ©el + +## đŸ§Ș Exo 8 — Un bouton « Mode sombre » + +**🎯 Objectif :** un bouton qui bascule la page en thĂšme sombre, et re-clic pour revenir. + +**🔍 Pistes :** +- PrĂ©pare une classe CSS (ex. `body.sombre { ... }`) avec un fond foncĂ© et un texte clair. +- En JS, pour ajouter/enlever une classe en un seul geste → cherche `classList toggle`. + +**✅ Test :** clic → sombre, re-clic → clair. + +## đŸ§Ș Exo 9 — Une horloge qui tourne dans le pied de page + +**🎯 Objectif :** afficher l'heure actuelle, mise Ă  jour **chaque seconde**. + +**🔍 Pistes :** +- Pour obtenir l'heure : cherche `MDN Date` et `toLocaleTimeString`. +- Pour rĂ©pĂ©ter une action Ă  intervalle rĂ©gulier → cherche `MDN setInterval` (la durĂ©e est en **millisecondes** : 1 seconde = ?). + +**✅ Test :** l'heure s'affiche et avance toute seule. + +--- + +# 🔮 Étape 6 — Aller chercher des donnĂ©es ailleurs (`fetch`) + +C'est l'Ă©tape la plus avancĂ©e, prends ton temps. + +## đŸ§Ș Exo 10 — Charger une liste de vĂ©hicules depuis un fichier JSON + +**🎯 Objectif :** crĂ©er un fichier `vehicules.json` (quelques vĂ©hicules : modĂšle, immatriculation, km) et l'afficher dans un tableau via JavaScript, au lieu de l'Ă©crire en dur. + +**🔍 Pistes :** +- Le format JSON ressemble Ă  une liste d'objets, mais avec des rĂšgles strictes (guillemets doubles partout, pas de virgule finale) → cherche `JSON format`. +- Pour aller chercher un fichier → cherche `MDN fetch`. Comme ça prend du temps, on utilise `async` / `await` → cherche `async await javascript`. +- ⚠ **Important :** `fetch` ne marche pas si tu ouvres la page en double-cliquant (`file://`). Il faut un mini-serveur : dans un terminal, dans le dossier du projet, lance `python3 -m http.server 8000`, puis ouvre `http://localhost:8000/...`. Cherche `python http server` si besoin. +- Pour rĂ©agir si le fichier est introuvable → cherche `try catch javascript`. + +**✅ Test :** la liste des vĂ©hicules s'affiche. Renomme le fichier exprĂšs → un message d'erreur s'affiche au lieu d'un plantage. + +--- + +# 🏁 Étape 7 — Pour ĂȘtre au niveau du reste du projet + +## đŸ§Ș Exo 11 — La navbar en composant rĂ©utilisable + +**🎯 Objectif :** ta barre de navigation est recopiĂ©e Ă  l'identique dans `index.html`, `services.html`, `contact.html`. L'Ă©crire **une seule fois** en JavaScript et l'injecter sur la page. + +**🔍 Pistes :** +- Une **fonction** qui **renvoie** le HTML de la navbar (avec `return` et un *template literal*) → cherche `javascript return` et `template literals`. +- Pour insĂ©rer ce HTML en haut du `` → cherche `insertAdjacentHTML`. +- Pour mettre en valeur le bouton de la page courante, passe Ă  la fonction un **paramĂštre** (ex. la page active) et utilise une condition pour choisir la classe du bouton. + +**✅ Test :** supprime la navbar Ă©crite en dur dans le HTML, garde le JS → elle rĂ©apparaĂźt. Changer un lien = un seul endroit Ă  modifier. + +--- + +## đŸ—ș Quand tu auras fait tout ça, tu sauras : + +- les **conditions** (`if`/`else`, ternaire) et les **Ă©vĂ©nements** (`input`, `submit`, `click`) +- les **tableaux** et **objets**, les **boucles**, `filter` +- **gĂ©nĂ©rer du HTML** depuis des donnĂ©es +- la **mĂ©moire** (`localStorage`) et le piĂšge du texte vs nombre +- le **style dynamique** (`classList`) et le **temps rĂ©el** (`setInterval`) +- les **donnĂ©es distantes** (`fetch`, `async`/`await`, JSON) +- le **composant rĂ©utilisable** + +C'est exactement le niveau oĂč en est la page contact, tu seras Ă  jour. + +Note tes questions au fur et Ă  mesure — et rĂ©siste Ă  l'envie de chercher « la rĂ©ponse toute faite » : cherche d'abord **le concept**, le code viendra de toi.