Correction: prenom dans l'alerte — expliquer les 2 bugs (.value manquant + lecture trop tot)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-19 16:20:25 +02:00
parent 849671b542
commit c2979534f1
+81
View File
@@ -0,0 +1,81 @@
# 🔧 Correction — enregistrer et afficher le prénom dans l'alerte
Tu veux qu'au moment de l'envoi, l'alerte affiche le **prénom** saisi. Ton alerte affiche sûrement quelque chose comme :
```
merci [object HTMLInputElement], ton message a été pris en compte
```
Voici **pourquoi**, et comment t'en sortir — sans te donner la solution toute faite.
---
## 🔍 Ce que tu as écrit
```js
const nom = document.getElementById("prenom");
const greeting = `merci ${nom}, ton message a été pris en compte`;
// ...
} else {
alert(`${greeting}`);
}
```
Il y a **deux soucis** qui se cumulent ici. Bonne nouvelle : tu sais déjà corriger les deux, tu le fais ailleurs dans ton fichier.
---
## 🪤 Souci n°1 — il manque `.value`
`document.getElementById("prenom")` te donne **la case** HTML entière (l'objet `<input>`), pas le texte dedans. Pour obtenir ce que la personne a **tapé**, il faut `.value` — exactement comme tu fais avec `zoneMessage.value` pour la textarea.
```js
nom // ❌ la case → s'affiche "[object HTMLInputElement]"
nom.value // ✅ le texte tapé → "Mélissa"
```
C'est ça qui produit le `[object HTMLInputElement]` dans ton alerte.
---
## 🪤 Souci n°2 — tu lis la valeur **trop tôt**
Regarde **où** tu construis `greeting` : tout **en haut** du fichier. Or ce code s'exécute **au chargement de la page**, à un instant où l'utilisateur n'a encore **rien tapé**. Le champ est vide à ce moment-là.
Du coup, même si tu ajoutes `.value`, `greeting` serait figé sur le champ **vide du démarrage**, et ne changerait jamais.
```js
// en haut du fichier = au chargement → le champ est VIDE
const greeting = `merci ${nom.value}, ...`; // ❌ figé sur "" pour toujours
```
👉 La phrase doit être fabriquée **au moment du clic sur Envoyer**, c'est-à-dire **à l'intérieur** de la fonction `submit`. C'est seulement là que le champ contient ce que la personne a saisi.
> 🔎 Tu as déjà ce réflexe ailleurs : dans `rafraichirCompteur`, tu lis `zoneMessage.value` **au moment** où on tape, pas une fois pour toutes au début. Même logique ici.
---
## 🧩 Ce qu'il te reste à faire (à toi de l'écrire)
1. Garde en haut seulement l'**attrape-élément** : `const champPrenom = document.getElementById("prenom");` (sans `.value`).
2. Dans le `else` (message non vide), **à ce moment-là**, lis `champPrenom.value` et construis ta phrase, puis `alert(...)`.
3. Pour l'**enregistrer** : `localStorage.setItem("…", champPrenom.value)` — tu sais déjà faire, tu l'utilises pour le brouillon.
> 💡 Ton formulaire est en `method="get"` : quand l'envoi réussit, **la page se recharge** et l'alerte disparaît aussitôt. Comme il n'y a pas de serveur derrière, le plus simple pour ce TP est d'appeler `evenement.preventDefault()` **aussi** dans le `else`, pour que la page ne recharge pas et que tu voies ton alerte.
---
## ✅ Comment vérifier
1. Tape un prénom + un message, clique **Envoyer** → l'alerte dit « merci **\<ton prénom\>**, … » (et **plus** `[object HTMLInputElement]`).
2. Console (F12) : tape `localStorage.getItem("…")` (la clé que tu as choisie) → tu retrouves le prénom enregistré.
3. Laisse le prénom **vide** et envoie → décide quoi faire (afficher « merci visiteur », ou exiger le prénom comme tu le fais déjà pour le message).
---
## 🧪 Pour aller plus loin
- Ajouter le **nombre de caractères** du message dans l'alerte (`…value.length`).
- Au prochain chargement, accueillir la personne : « Re-bonjour \<prénom\> » en relisant ce que tu as enregistré (`getItem`).
Note ta question si un point bloque encore.