JavaScript : rendre le Web interactif (école d'ingénieur) · Chapitre 8 · Exercice de TD
Quantités modifiables
Événements et formulaires · niveau 2
Énoncé
Un tableau de panier contient, pour chaque livre, un champ de quantité (min="0", max="20") ; le prix unitaire est dans l'attribut data-prix de la ligne. Recalculer le total à chaque modification d'une quantité, avec un seul écouteur. Une quantité vide ou hors bornes compte pour 0.
<tbody id="lignes">
<tr data-prix="32"><td>Programmation Java</td><td>32 €</td><td><input type="number" min="0" max="20" value="1" aria-label="Quantité de Programmation Java"></td></tr>
<tr data-prix="8.5"><td>Le Petit Prince</td><td>8,50 €</td><td><input type="number" min="0" max="20" value="2" aria-label="Quantité de Le Petit Prince"></td></tr>
</tbody>Corrigé
const lignes = document.querySelector("#lignes");
const total = document.querySelector("#total");
const euros = new Intl.NumberFormat("fr-FR", { style: "currency", currency: "EUR" });
function recalculer() {
let somme = 0;
for (const ligne of lignes.rows) {
const champ = ligne.querySelector("input");
const quantite = champ.validity.valid ? champ.valueAsNumber || 0 : 0;
somme += Number(ligne.dataset.prix) * quantite;
}
total.value = euros.format(somme);
console.log(total.value);
}
// Un seul écouteur « input » sur le corps du tableau : l'événement remonte
// depuis n'importe quel champ de quantité.
lignes.addEventListener("input", recalculer);
recalculer();
Au chargement, puis avec 3 exemplaires de Java, avec une quantité vide pour le Petit Prince, et enfin avec 25 :
49,00 €
113,00 €
96,00 €
96,00 €
, puis . Un champ vide a pour valueAsNumber NaN, que || 0 remplace par 0. La quantité 25 dépasse le maximum : le champ n'est pas valide et compte pour 0, d'où 96 €.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.