Aller au contenu

Un mot pour Fahmio

Tu écris. Tu continues.

Un problème, une idée — assez pour qu’on comprenne, puis tu retournes à ta copie.

On lit. Tu n’as rien d’autre à faire.

Où veux-tu aller ?

↑ ↓ pour parcourir · Entrée pour ouvrir · Échap pour fermer

Fahmio
Fahmio
Bac Tunisie
WB-GWeb et TIC

JavaScript donné — compléter les tâches parmi des propositions, tracer sur des états du formulaire, déduire le rôle

Idée directrice

Au bac Sciences de l’informatique, le JavaScript se lit : un script de validation ou de mise en forme est donné, souvent à trous. Il faut choisir l’expression exacte de chaque tâche parmi trois, tracer une fonction sur des états précis du formulaire (cases cochées, champ vide), déduire le rôle d’une fonction appelée par onload, relier des éléments du langage à leur rôle et juger des variantes d’un script. C’est la même démarche que la trace d’un algorithme — valeurs successives, résultat, rôle — appliquée au DOM : id et name des champs, value, checked, selectedIndex, innerHTML. WB-B (écrire une fonction verif… de bout en bout) reste l’échauffement d’écriture.

Ce qui aide à reconnaître la démarche

« en écrivant le numéro de l’expression correcte correspondante à chaque « Tâche » indiquée dans la fonction » ; « Indiquer devant chaque rôle l’élément du langage JavaScript qui lui correspond » ; « donner pour chaque exemple la valeur retournée en complétant la trace d’exécution » ; « En déduire le rôle de la fonction inconnue » ; « Donner le résultat de l’exécution de l’instruction de la ligne »

Besoin d’un point de départ ? Voir la méthode
  • Lire d’abord le HTML : id (pour getElementById), name (pour getElementsByName), value des options et des cases.
  • Compléter une tâche : casse exacte (true, toUpperCase()), propriété sans parenthèses (length, value, checked, selectedIndex), méthode avec (charAt(i), trim()).
  • Tracer une boucle en tableau (une ligne par tour), puis annoncer la valeur retournée et le message affiché (alert ou innerHTML).
  • Juger une variante : compteur initialisé ? compteur déclaré const ? indices de 0 à length − 1 ? conversion parseInt/Number avant une somme ?
Les pièges à vérifier dans ta démarche

Écrire True, x.length() ou charAt(i) sans objet ; oublier que value est une chaîne ("12" + "7" = "127") ; tester selectedIndex == -1 alors que l’option d’invite est sélectionnée (rang 0) ; appliquer .src à une liste renvoyée par getElementsByName ; oublier d’initialiser un compteur ou le déclarer const ; parcourir les indices de 1 à length ; confondre alert (boîte de dialogue) et innerHTML (contenu d’un élément de la page).

Sujet principal

Exercice 3 — analyse et interprétation du code JavaScript, dans l’esprit des sessions 2023–2025

1 questionCorrigé masqué

La page carte.html du site VéloCité permet de recharger une carte d’abonné. Son formulaire (figure 1) est contrôlé par les fonctions du fichier externe controleVelo.js (figure 2), dont la fonction verifier() est incomplète.

Figure 1 — code HTML de carte.html :

 1 <body onload="inconnue()">
 2   <form id="f" action="abonnement.php" method="post" onsubmit="return verifier()">
 3     <label>N° de carte :</label> <input type="text" id="carte" name="carte" maxlength="8"><br>
 4     <label>Formule :</label>
 5     <select id="formule" name="formule">
 6       <option>Choisir une formule</option>
 7       <option value="F1">Journalier</option>
 8       <option value="F2">Mensuel</option>
 9       <option value="F3">Annuel</option>
10     </select><br>
11     <label>Début :</label> <input type="date" id="debut" name="debut"><br>
12     <label>Stations favorites (3 au plus) :</label>
13     <input type="checkbox" name="station[]" value="1">Bab Bhar
14     <input type="checkbox" name="station[]" value="2">Sfax Jadida Nord
15     <input type="checkbox" name="station[]" value="3">Jardin Taparura
16     <input type="checkbox" name="station[]" value="4">Gare<br>
17     <p id="message"></p>
18     <input type="submit" value="Valider"> <input type="reset" value="Annuler">
19   </form>
20 </body>

Figure 2 — extrait de controleVelo.js :

 1 function inconnue()
 2 {
 3   const d = new Date()
 4   let m = d.getMonth() + 1
 5   if (m < 10)
 6     m = "0" + m
 7   document.getElementById("debut").value = d.getFullYear() + "-" + m + "-01"
 8 }
 9 function stations()
10 {
11   const cases = document.getElementsByName("station[]")
12   let n = 0
13   for (let i = 0; i < cases.length; i++)
14     if (cases[i].checked)
15       n = n + 1
16   return n
17 }
18 function verifier()
19 {
20   let carte = document.getElementById("carte").value.trim()
21   let ok = ……①……                  // Tâche_1
22   let i = 0
23   while (i < ……②…… ……③…… ok)        // Tâche_2, Tâche_3
24   {
25     let c = ……④……                 // Tâche_4
26     if (c < "0" || c > "9")
27       ok = false
28     else
29       i = i + 1
30   }
31   if (……⑤…… (ok && carte.length == 8))    // Tâche_5
32   { ……⑥……("Le numéro de carte doit comporter 8 chiffres")    // Tâche_6
33     return false }
34   if (document.getElementById("formule").selectedIndex == 0)
35   { alert("Il faut choisir une formule")
36     return false }
37   let n = stations()
38   if (n == 0 || n > 3)
39   { document.getElementById("message").innerHTML = "Cochez entre 1 et 3 stations"
40     return false }
41   return true
42 }

1. Pour chaque ligne de la fonction verifier() contenant des pointillés, on propose trois expressions dont une seule réalise la tâche indiquée. Compléter le tableau en écrivant le numéro de l’expression correcte correspondant à chaque « Tâche ».
- Tâche_1 (Initialiser ok à vrai) : 1. True ; 2. true ; 3. vrai
- Tâche_2 (Récupérer la longueur de carte) : 1. carte.length() ; 2. length(carte) ; 3. carte.length
- Tâche_3 (Utiliser l’opérateur logique ET) : 1. && ; 2. AND ; 3. ||
- Tâche_4 (Récupérer le iᵉ caractère de carte) : 1. carte.charCodeAt(i) ; 2. carte.charAt(i) ; 3. charAt(i)
- Tâche_5 (Utiliser l’opérateur de négation) : 1. not ; 2. <> ; 3. !
- Tâche_6 (Afficher un message dans une boîte de dialogue) : 1. echo ; 2. alert ; 3. write

Tâche123456
N° de l’expression

2. On considère les trois exemples suivants, saisis avant un clic sur « Valider » (la fonction verifier() étant complétée) :
- Exemple 1 : N° de carte « 20A60417 », formule « Mensuel », stations cochées : Bab Bhar et Gare.
- Exemple 2 : N° de carte laissé vide, formule « Annuel », aucune station cochée.
- Exemple 3 : N° de carte « 20260417 », formule « Mensuel », stations cochées : Bab Bhar, Jardin Taparura et Gare.
a. Pour l’exemple 1, donner les valeurs successives de i, c et ok lors de l’exécution de la boucle while (lignes 23 à 30), puis la valeur retournée par verifier() et le message affiché.
b. Pour l’exemple 2, combien de fois la boucle while s’exécute-t-elle ? Donner la valeur de ok à la sortie de la boucle, la valeur retournée par verifier() et le message affiché. Que se passerait-il si le test carte.length == 8 n’existait pas ?
c. Pour l’exemple 3, donner, à chaque tour de la boucle for de la fonction stations(), les valeurs de i, de cases[i].checked et de n, puis la valeur retournée par stations() et celle retournée par verifier().

3. On s’intéresse à la fonction inconnue().
a. Quand cette fonction est-elle exécutée ?
b. Pourquoi ajoute-t-on 1 à la ligne 4, et pourquoi ajoute-t-on « 0 » devant m à la ligne 6 ?
c. En déduire le rôle de la fonction inconnue().

4. Indiquer devant chaque rôle l’élément du langage JavaScript qui lui correspond :
- Méthode qui supprime les espaces au début et à la fin d’une chaîne.
- Propriété qui donne le rang de l’option choisie dans une liste déroulante.
- Propriété qui modifie le contenu HTML d’un élément.
- Méthode qui retourne la liste des éléments ayant le même nom.
- Propriété qui indique si une case est cochée ou non.
- Méthode qui retourne le mois d’une date, de 0 (janvier) à 11 (décembre).
- Méthode qui retourne l’élément ayant un identifiant donné.
- Propriété qui contient le contenu d’un champ de saisie.

5. Pour chacune des versions suivantes de la fonction stations(), répondre par V si elle retourne bien le nombre de stations cochées, ou par F dans le cas contraire.

Version A :

function stations()
{
  const cases = document.getElementsByName("station[]")
  let n = 0
  for (const i = 0; i < cases.length; i++)
    if (cases[i].checked)
      n = n + 1
  return n
}


Version B :

function stations()
{
  const cases = document.getElementsByName("station[]")
  let n
  for (let i = 0; i < cases.length; i++)
    if (cases[i].checked)
      n = n + 1
  return n
}


Version C :

function stations()
{
  const cases = document.getElementsByName("station[]")
  let n = 0
  let i = 0
  while (i < cases.length)
  { if (cases[i].checked == true)
      n++
    i++ }
  return n
}


Version D :

function stations()
{
  const cases = document.getElementsByName("station[]")
  let n = 0
  for (let i = 1; i <= cases.length; i++)
    if (cases[i].checked)
      n = n + 1
  return n
}
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : en JavaScript, la casse et les parenthèses comptent — true en minuscules, length est une propriété (sans parenthèses), charAt est une méthode appelée sur la chaîne, ! et && sont les opérateurs logiques.

Tâche123456
N°231232

Tâche_1 : true (True et vrai ne sont pas des valeurs JavaScript : la casse compte) ; Tâche_2 : carte.length ; Tâche_3 : && ; Tâche_4 : carte.charAt(i) (charCodeAt renvoie un code numérique) ; Tâche_5 : ! ; Tâche_6 : alert (echo est du PHP).

2.a Idée : la boucle avance tant que le caractère courant est un chiffre ; au premier caractère qui n’en est pas un, ok passe à false et la boucle s’arrête.

Tourcoki (fin du tour)
1"2"true1
2"0"true2
3"A"false2

Sortie de boucle avec i = 2 et ok = false : la condition !(ok && carte.length == 8) est vraie. verifier() affiche la boîte de dialogue « Le numéro de carte doit comporter 8 chiffres » et retourne false : le formulaire n’est pas envoyé.

2.b Idée : une chaîne vide a une longueur 0, donc la condition i < carte.length est fausse dès le départ. La boucle s’exécute 0 fois et ok reste true. Mais carte.length == 8 est faux, donc !(true && false) est vrai : alerte « Le numéro de carte doit comporter 8 chiffres » et retour false. Sans ce test, la condition deviendrait !ok, fausse ici : une carte vide passerait le contrôle du numéro (aucun caractère n’est refusé), et il en irait de même pour un numéro de moins de 8 chiffres. Pour l’exemple 2, verifier() continuerait : la formule « Annuel » a le rang 3 (≠ 0), puis stations() retourne 0 ; le paragraphe message affiche alors « Cochez entre 1 et 3 stations » et verifier() retourne false.

2.c La carte « 20260417 » passe la boucle (8 chiffres), la formule a le rang 2 (≠ 0). Trace de stations() :

icases[i].checkedn
0true1
1false1
2true2
3true3

stations() retourne 3, compris entre 1 et 3 : verifier() retourne true, les données sont envoyées à abonnement.php.

3.a Au chargement de la page, grâce à onload="inconnue()" (ligne 1 de carte.html).

3.b getMonth() renvoie le mois de 0 (janvier) à 11 (décembre) : on ajoute 1 pour obtenir le numéro usuel. Le « 0 » écrit les mois 1 à 9 sur deux chiffres (« 03 » et non « 3 ») : un champ type="date" attend une valeur de la forme aaaa-mm-jj.

3.c inconnue() initialise le champ « Début » (id debut) au premier jour du mois en cours : par exemple « 2026-03-01 » si la page est ouverte le 15 mars 2026.

4.

RôleÉlément
Méthode qui supprime les espaces au début et à la fin d’une chaîne.trim()
Propriété qui donne le rang de l’option choisie dans une liste déroulante.selectedIndex
Propriété qui modifie le contenu HTML d’un élément.innerHTML
Méthode qui retourne la liste des éléments ayant le même nom.getElementsByName()
Propriété qui indique si une case est cochée ou non.checked
Méthode qui retourne le mois d’une date, de 0 (janvier) à 11 (décembre).getMonth()
Méthode qui retourne l’élément ayant un identifiant donné.getElementById()
Propriété qui contient le contenu d’un champ de saisie.value

5. Idée : pour chaque version, vérifier l’initialisation du compteur, le compteur de boucle et les bornes des indices.

  • Version A : F — le compteur i est déclaré const : l’instruction i++ provoque une erreur à la fin du premier tour.
  • Version B : F — n n’est pas initialisé (undefined) : n + 1 donne NaN, la fonction retourne NaN dès qu’une case est cochée (et undefined si aucune ne l’est).
  • Version C : V — boucle while équivalente : n initialisé à 0, i de 0 à cases.length − 1, n++ ajoute 1.
  • Version D : F — les indices vont de 0 à cases.length − 1 : la case d’indice 0 (Bab Bhar) est ignorée et cases[cases.length] n’existe pas, d’où une erreur au dernier tour.

Changer d’énoncé, garder le raisonnement

Choisis un seul transfert après le sujet principal. Qu’est-ce qui change ? Quel résultat ou quelle méthode peux-tu réutiliser ? Les autres exercices restent disponibles pour une prochaine séance.

Variantes rencontrées : compléter une fonction de validation en choisissant une expression parmi trois pour chaque tâche (principale et contrôle 2023) ; résultat d’une instruction, rôle de trim et aperçus qui déclenchent une fonction (contrôle 2024) ; portée locale ou globale et rôle de indexOf, substr, innerHTML (principale 2024) ; V/F sur selectedIndex, src et quatre versions d’un script, puis rôle de inconnue() (principale 2025) ; éléments du langage ↔ rôles et trace de inconnue() sur deux exemples (contrôle 2025) ; compléter une fonction de validation et donner les valeurs finales après un onchange (principale 2026).

Exercices d'entraînement — une nuance à la fois

1 Drill WB-G.1 — changer l’image affichée : la propriété src
Entraînement 01 / 04

Drill WB-G.1 — changer l’image affichée : la propriété src

4 questionsCorrigé masqué

Sur la page modeles.html du site VéloCité, le choix d’un modèle dans la liste doit afficher sa photo (M1.png, M5.png ou M6.png).

1 <select id="modele" onchange="changerPhoto()">
2   <option value="M1">Urbain 3V</option>
3   <option value="M5">E-City</option>
4   <option value="M6">E-Trek</option>
5 </select>
6 <img id="photo" name="photo" src="M1.png" alt="Modèle Urbain 3V">
function changerPhoto()
{
  let code = document.getElementById("modele").value
  ………………………………………
}
  1. Quand la fonction changerPhoto() est-elle exécutée ?
  2. Pour chacune des instructions suivantes, proposée pour compléter la fonction, répondre par V si elle affiche la photo du modèle choisi, ou par F sinon :
    - ☐ document.getElementById("photo").src = code + ".png"
    - ☐ document.getElementById("photo").name = code + ".png"
    - ☐ document.getElementsByName("photo").src = code + ".png"
    - ☐ document.getElementsByName("photo")[0].src = code + ".png"
  3. L’utilisateur choisit « E-City ». Quel fichier image est alors affiché ?
  4. Écrire l’instruction à ajouter pour que le texte alternatif de l’image devienne « Modèle » suivi du code choisi.
Voir la correction commentéeAprès avoir posé votre démarche

1. Lorsque l’utilisateur choisit une autre option de la liste : évènement onchange de <select>.

2. Idée : c’est l’attribut src qui désigne le fichier affiché ; getElementsByName renvoie une liste, pas un élément.

  • V — on change la source de l’image identifiée par son id ;
  • F — name n’est que le nom de l’élément : la photo ne change pas ;
  • F — getElementsByName("photo") renvoie une liste d’éléments ; écrire .src sur la liste ne modifie aucune image ;
  • V — [0] désigne le premier (et seul) élément de nom photo, dont on change la source.

3. La valeur de l’option « E-City » est M5 : le fichier affiché est M5.png.

4. document.getElementById("photo").alt = "Modèle " + code

2 Drill WB-G.2 — convertir la valeur d’un champ avant de calculer : parseInt et Number
Entraînement 02 / 04

Drill WB-G.2 — convertir la valeur d’un champ avant de calculer : parseInt et Number

4 questionsCorrigé masqué

Sur une page du site VéloCité, deux champs <input type="text" id="t1"> et <input type="text" id="t2"> reçoivent le nombre de trajets de deux semaines ; la fonction total() doit afficher leur somme dans <span id="somme">.

1 function total()
2 {
3   let a = document.getElementById("t1").value
4   let b = document.getElementById("t2").value
5   document.getElementById("somme").innerHTML = a + b
6 }
  1. L’utilisateur saisit 12 et 7. Qu’affiche la fonction ? Expliquer.
  2. Pour corriger la ligne 5, on remplace a + b par l’une des expressions suivantes. Répondre par V si l’affichage devient 19, F sinon :
    - ☐ parseInt(a) + parseInt(b)
    - ☐ Number(a) + Number(b)
    - ☐ parseInt(a + b)
    - ☐ String(a) + String(b)
  3. Avec la correction parseInt(a) + parseInt(b), qu’affiche la fonction si le second champ est laissé vide ? Et avec Number(a) + Number(b) ?
  4. L’utilisateur saisit 7.5 puis 12. Comparer les affichages obtenus avec parseInt et avec Number.
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : la propriété value d’un champ est toujours une chaîne. "12" + "7" est une concaténation : la fonction affiche 127.

2. V — V — F (parseInt("127") donne 127 : la concaténation a lieu avant la conversion) — F (concaténation de deux chaînes : 127).

3. parseInt("") vaut NaN, donc la somme vaut NaN et la fonction affiche « NaN ». Number("") vaut 0 : affichage 12.

4. parseInt("7.5") garde la partie entière 7 : affichage 19. Number("7.5") vaut 7,5 : affichage 19.5.

3 Drill WB-G.3 — liste déroulante avec option d’invite : tester selectedIndex == 0
Entraînement 03 / 04

Drill WB-G.3 — liste déroulante avec option d’invite : tester selectedIndex == 0

4 questionsCorrigé masqué

Le formulaire de la page reservation.html (site VéloCité) contient la liste suivante ; au chargement, l’option d’invite est affichée. La fonction de validation, appelée par onsubmit="return verifier()", doit refuser l’envoi si aucune station n’a été choisie.

1 <select id="station" name="station">
2   <option value="">-- Choisir une station --</option>
3   <option value="1">Bab Bhar</option>
4   <option value="2">Sfax Jadida Nord</option>
5   <option value="4">Gare</option>
6 </select>
  1. L’utilisateur n’a rien choisi. Pour chacun des tests suivants, répondre par V s’il détecte cette situation, F sinon :
    - ☐ document.getElementById("station").selectedIndex == 0
    - ☐ document.getElementById("station").selectedIndex == -1
    - ☐ document.getElementById("station").value == ""
    - ☐ document.getElementById("station").checked == false
  2. Quelles sont les valeurs de selectedIndex et de value quand l’utilisateur a choisi « Gare » ?
  3. La ligne 2 est remplacée par <option>-- Choisir une station --</option> (sans attribut value). Lequel des tests V de la question 1 reste valable ?
  4. Écrire le début de la fonction verifier() qui affiche « Choisissez une station » et bloque l’envoi si aucune station n’est choisie.
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : l’option d’invite est la première, d’indice 0 ; c’est elle qui est sélectionnée tant que l’utilisateur n’a rien choisi.

  • V — rang 0 : l’invite est sélectionnée ;
  • F — selectedIndex vaut −1 seulement si aucune option n’est sélectionnée, ce qui n’est pas le cas ici (l’invite l’est) ;
  • V — la valeur de l’invite est la chaîne vide ;
  • F — checked concerne les cases à cocher et les boutons radio ; pour une liste, cette propriété n’existe pas et le test n’est jamais vrai.

2. selectedIndex = 3 (4ᵉ option, on compte à partir de 0) et value = "4" (la value de l’option, pas son texte).

3. Sans attribut value, la valeur d’une option est son texte : value vaut « -- Choisir une station -- » et le test value == "" devient faux. Seul selectedIndex == 0 reste valable.

4.

function verifier()
{
  if (document.getElementById("station").selectedIndex == 0)
  { alert("Choisissez une station")
    return false }
  …
4 Drill WB-G.4 — portée des variables : locale ou globale
Entraînement 04 / 04

Drill WB-G.4 — portée des variables : locale ou globale

4 questionsCorrigé masqué

On considère l’extrait suivant d’un fichier JavaScript lié à une page web du site VéloCité ; la page contient <p id="res"></p> et appelle afficher() au clic sur un bouton.

 1 let total = 0
 2 function ajouter(prix)
 3 {
 4   let remise = 0
 5   if (prix > 10)
 6   { remise = 1
 7     nb = 1 }
 8   total = total + prix - remise
 9   return total
10 }
11 function afficher()
12 {
13   ajouter(12)
14   ajouter(4)
15   document.getElementById("res").innerHTML = total + " D / " + nb
16 }
  1. Préciser la portée (locale ou globale) de chacune des variables total, prix, remise et nb.
  2. Donner, à la fin de chaque appel de ajouter() effectué par afficher(), les valeurs de remise et de total, puis le texte affiché dans le paragraphe res.
  3. La ligne 13 est remplacée par ajouter(8). Qu’obtient-on au clic sur le bouton (page juste chargée) ? Expliquer.
  4. On écrit let nb = 1 à la ligne 7 (lignes 13 et 14 inchangées). Que se passe-t-il à la ligne 15 ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : une variable déclarée hors de toute fonction est globale ; déclarée par let dans une fonction (ou un paramètre), elle est locale ; affectée sans déclaration, elle devient globale.

  • total : globale (déclarée ligne 1, hors fonction) ;
  • prix : locale (paramètre de ajouter) ;
  • remise : locale (let dans ajouter) ;
  • nb : globale (affectée ligne 7 sans let ni var : variable globale implicite).

2. ajouter(12) : 12 > 10, donc remise = 1, nb = 1 et total = 0 + 12 − 1 = 11. ajouter(4) : remise = 0 et total = 11 + 4 − 0 = 15. Le paragraphe affiche 15 D / 1.

3. Aucun prix ne dépasse 10 : la ligne 7 n’est jamais exécutée et nb n’existe pas. La ligne 15 provoque une erreur (« nb is not defined ») : rien n’est affiché.

4. nb devient locale au bloc { … } du if : elle n’existe plus à la ligne 15, qui provoque la même erreur ; rien n’est affiché.

Relier ce raisonnement au bac

Choisis une filière pour voir les sujets qui étayent ce scénario.