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-EWeb et TIC

HTML5 — lire une page numérotée : rôle ↔ ligne, attributs du formulaire, balises à insérer, comportements

Idée directrice

Depuis 2024, la partie web du bac Sciences de l’informatique ne fait plus écrire une page : elle donne l’aperçu d’une page et son code HTML5 numéroté, souvent incomplet, et fait lire ce code. Le candidat relie des rôles à des numéros de ligne, complète les attributs du formulaire (action, method, onsubmit avec return, type des boutons), place des balises manquantes à la bonne ligne, choisit le sens d’une balise ou d’un attribut, et explique un comportement. Tout repose sur un réflexe : nommer la balise ou l’attribut qui réalise le rôle, puis le situer dans la structure head / body / form.

Ce qui aide à reconnaître la démarche

« Indiquer devant chaque rôle le numéro de la ligne contenant le code HTML qui lui correspond » ; « écrire devant chaque balise le numéro de la ligne dans laquelle elle doit être insérée » ; « compléter chaque ligne du tableau par la valeur de l’attribut concerné » ; « mettre une croix (X) dans la case correspondante à la proposition correcte » ; « sachant qu’il manque le mot clé return dans l’attribut onsubmit »

Besoin d’un point de départ ? Voir la méthode
  • Pour « rôle ↔ ligne », nommer d’abord la balise ou l’attribut (script src, onload, header, href="#…", type="hidden", select, span, meta description), puis chercher sa ligne.
  • Formulaire : action = page serveur ; method = POST si les données ne doivent pas apparaître dans l’URL ; onsubmit = "return f()" ; boutons submit / reset.
  • Insertion : <link> dans <head>, <body onload> ouvre le corps, <legend> juste après <fieldset>, bouton reset à côté du submit, <footer> avant </body>.
  • Comportements : sans return l’envoi a toujours lieu ; des radios ne s’excluent que s’ils partagent le même name ; seuls les champs nommés sont envoyés.
Les pièges à vérifier dans ta démarche

Confondre action (l’adresse de la page serveur) et method (GET ou POST) ; écrire onsubmit="verifier()" sans return ; placer <link> dans le corps de la page ; prendre <head> pour <header> ; croire que le texte d’un <span> ou un champ sans name est envoyé ; confondre alt (texte de remplacement) et title (info-bulle) ; croire qu’un lien vers « autrepage.html#ancre » est interne.

Sujet principal

Exercice 1 — analyse et interprétation du code HTML, dans l’esprit des sessions 2022–2025

1 questionFigure fournieCorrigé masqué

Le site du service de vélos en libre-service VéloCité (Sfax) comporte les fichiers abonnement.html, styleVelo.css, controleVelo.js et abonnement.php. La page abonnement.html permet de demander un abonnement (figure 1) ; son code HTML, incomplet, est donné ci-dessous (figure 2).

Figure 2 — code HTML de abonnement.html (les lignes en pointillés et les attributs ① à ⑤ sont à compléter) :

 1 <!DOCTYPE html>
 2 <html lang="fr">
 3 <head>
 4   <meta charset="utf-8">
 5   <meta name="description" content="Abonnement au service VéloCité de Sfax">
 6   <title>VéloCité - Abonnement</title>
 7   ………………………………………
 8   <script src="controleVelo.js"></script>
 9 </head>
10 <body onload="initialiser()">
11   <header>
12     <h1>VéloCité : vélos en libre-service à Sfax</h1>
13     <nav>
14       <a href="index.html">Accueil</a>
15       <a href="stations.html" target="_blank">Carte des stations</a>
16       <a href="#abo">S'abonner</a>
17     </nav>
18   </header>
19   <section id="abo">
20     <form id="f" name="f" action="…①…" method="…②…" onsubmit="…③…">
21       <fieldset>
22         ………………………………………
23         <label>Nom et prénom :</label> <input type="text" id="nom" name="nom" required><br>
24         <label>Téléphone :</label> <input type="text" id="tel" name="tel" maxlength="8"><br>
25         <label>E-mail :</label> <input type="…⑤…" id="mail" name="mail"><br>
26         ………………………………………
27         <select id="formule" name="formule">
28           <option>Choisir une formule</option>
29           <option value="F1">Journalier</option>
30           <option value="F2">Mensuel</option>
31           <option value="F3">Annuel</option>
32         </select><br>
33         <label>Vélo préféré :</label>
34         <input type="radio" name="classique" value="C">Classique
35         <input type="radio" name="electrique" value="E">Électrique<br>
36         <label>Trajets par semaine :</label>
37         <input type="range" id="nbTrajets" name="nbTrajets" min="0" max="14" value="0" onchange="afficher()">
38         <span id="valeur">0</span><br>
39         <input type="hidden" name="canal" value="web">
40         <hr>
41         <img src="velo.png" width="120" height="80" alt="Vélo VéloCité en libre-service">
42         <div>
43           <input type="…④…" value="Envoyer la demande">
44           ………………………………………
45         </div>
46       </fieldset>
47     </form>
48   </section>
49   ………………………………………
50 </body>
51 </html>

1. Indiquer devant chaque rôle le numéro de la ligne contenant le code HTML qui lui correspond :
- Lier un fichier de scripts externe à la page web.
- Exécuter une fonction JavaScript dès que la page web est entièrement chargée.
- Définir un conteneur pour le contenu d’introduction de la page (titre et menu).
- Créer un lien vers une partie de la même page.
- Transmettre au serveur une donnée que l’utilisateur ne voit pas et ne saisit pas.
- Créer une liste déroulante.
- Créer un conteneur en ligne dont le contenu sera modifié par un script.
- Fournir une description de la page utilisée par les moteurs de recherche.

2. Sachant que le clic sur le bouton de la ligne 43 doit appeler la fonction verifier() du fichier controleVelo.js, puis envoyer les données au fichier abonnement.php sans les afficher dans la barre d’adresse du navigateur, et seulement si verifier() renvoie la valeur vraie ; et que le champ de la ligne 25 ne doit accepter qu’une adresse électronique (format contrôlé par le navigateur), compléter le tableau par la valeur de chacun des attributs ① à ⑤.

Attribut①②③④⑤
Valeur

3. Pour compléter le code HTML par les balises ci-dessous, écrire devant chaque balise le numéro de la ligne dans laquelle elle doit être insérée :
- <input type="reset" value="Effacer">
- <legend>Demande d'abonnement</legend>
- <footer>VéloCité Sfax - 2026</footer>
- <label>Formule :</label>
- <link rel="stylesheet" href="styleVelo.css">

4. Pour chacune des affirmations ci-dessous, mettre une croix (X) dans la case correspondant à la proposition correcte :
a. Avec method="POST" (ligne 20), les données du formulaire sont : ☐ ajoutées à l’adresse URL après un « ? » ☐ transmises dans le corps de la requête HTTP ☐ enregistrées dans un cookie du navigateur
b. La balise <hr> (ligne 40) insère : ☐ un retour à la ligne ☐ une ligne dans un tableau ☐ une ligne horizontale de séparation
c. L’élément <input type="range"> (ligne 37) permet de : ☐ sélectionner une valeur dans une plage définie par min et max ☐ saisir librement un nombre au clavier ☐ choisir plusieurs valeurs à la fois
d. L’attribut alt (ligne 41) sert à : ☐ définir le texte d’une info-bulle au survol de l’image ☐ définir un texte alternatif affiché si l’image ne peut pas être chargée ☐ définir la légende affichée sous l’image
e. L’attribut required (ligne 23) : ☐ désactive la saisie dans le champ ☐ empêche l’envoi du formulaire tant que le champ est vide ☐ remplit le champ par une valeur par défaut
f. L’attribut target="_blank" (ligne 15) permet : ☐ d’ouvrir stations.html dans le même onglet ☐ d’ouvrir stations.html dans un nouvel onglet ou une nouvelle fenêtre ☐ de n’ouvrir stations.html que si la page est vide

5. Expliquer les deux comportements suivants.
a. Une première version du formulaire portait onsubmit="verifier()". Un utilisateur saisit un téléphone de 5 chiffres : verifier() affiche une alerte puis renvoie false. Le fichier abonnement.php est-il quand même appelé ? Justifier.
b. Un utilisateur arrive à cocher à la fois « Classique » et « Électrique » (lignes 34 et 35). Expliquer pourquoi, puis réécrire ces deux lignes pour qu’un seul bouton puisse être coché.

Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : pour chaque rôle, nommer d’abord la balise ou l’attribut qui le réalise, puis chercher sa ligne dans le code.

RôleBalise / attributLigne
Lier un fichier de scripts externe à la page web.<script src="controleVelo.js">8
Exécuter une fonction JavaScript dès que la page web est entièrement chargée.<body onload="initialiser()">10
Définir un conteneur pour le contenu d’introduction de la page (titre et menu).<header>11
Créer un lien vers une partie de la même page.<a href="#abo"> (ancre interne)16
Transmettre au serveur une donnée que l’utilisateur ne voit pas et ne saisit pas.<input type="hidden">39
Créer une liste déroulante.<select>27
Créer un conteneur en ligne dont le contenu sera modifié par un script.<span id="valeur">38
Fournir une description de la page utilisée par les moteurs de recherche.<meta name="description">5

2. Idée : chaque phrase de la consigne désigne un attribut — « envoyer au fichier » → action, « sans les afficher dans la barre d’adresse » → method, « seulement si verifier() renvoie vrai » → return dans onsubmit.

AttributValeurJustification
① actionabonnement.phppage serveur qui reçoit les données
② methodPOSTdonnées transmises dans le corps de la requête, invisibles dans l’URL
③ onsubmitreturn verifier()l’envoi n’a lieu que si verifier() renvoie true
④ typesubmitbouton d’envoi du formulaire
⑤ typeemaille navigateur refuse un texte qui n’a pas la forme d’une adresse électronique

3. Idée : chaque balise a une seule place possible — <link> dans <head>, <legend> juste après <fieldset>, le libellé juste avant la liste qu’il annonce, le bouton reset à côté du bouton submit, <footer> après la section et avant </body>.

BaliseLigne
<input type="reset" value="Effacer">44
<legend>Demande d'abonnement</legend>22
<footer>VéloCité Sfax - 2026</footer>49
<label>Formule :</label>26
<link rel="stylesheet" href="styleVelo.css">7

4. a. transmises dans le corps de la requête HTTP : elles n’apparaissent pas dans la barre d’adresse (c’est la méthode GET qui les ajoute à l’URL après « ? ») ; b. une ligne horizontale de séparation (le retour à la ligne est <br>, la ligne de tableau <tr>) ; c. sélectionner une valeur dans une plage définie par min et max : un curseur, ici de 0 à 14 trajets ; d. définir un texte alternatif affiché si l’image ne se charge pas (et lu par les lecteurs d’écran) ; l’info-bulle est donnée par title ; e. empêche l’envoi du formulaire tant que le champ est vide (le navigateur signale le champ obligatoire) ; f. d’ouvrir stations.html dans un nouvel onglet ou une nouvelle fenêtre ; la page abonnement.html reste ouverte.

5.a Idée : sans return, la valeur renvoyée par verifier() est perdue. Oui, abonnement.php est appelé : onsubmit="verifier()" exécute la fonction (l’alerte s’affiche) mais ne transmet pas son résultat au navigateur ; l’envoi a donc lieu quelle que soit la valeur retournée. Seul onsubmit="return verifier()" bloque l’envoi quand la fonction renvoie false.

5.b Idée : des boutons radio ne s’excluent que s’ils ont le même name. Les deux boutons ont des name différents (« classique » et « electrique ») : le navigateur les traite comme deux groupes indépendants, chacun pouvant être coché. Correction :

<input type="radio" name="velo" value="C">Classique
<input type="radio" name="velo" value="E">Électrique<br>

Les value restent différentes : c’est elles qui indiquent au serveur le vélo choisi (velo=C ou velo=E).

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 : rôle ↔ numéro de ligne puis QCM sur method, hr, range et alt (principale 2025) ; V/F sur title, header, liens externes et required, puis lignes d’insertion de six balises (contrôle 2025) ; doctype, section, summary, onsubmit sans return et radios de name différents (contrôle 2024) ; onload, dossier d’une image, onmouseover, target="_blank" et hidden (principale 2024) ; valeurs des attributs action, method, onsubmit, submit et reset d’un formulaire d’authentification (contrôle 2022) ; douze QCM sur meta charset, rel, target vers un iframe, legend, radios de même name, onclick, min d’une date, onchange, placeholder, required, alt et iframe (principale 2026). Cette trajectoire remplace WB-A (pages à cadres frameset), que les épreuves nationales ne posent pas.

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

1 Drill WB-E.1 — balises de structure HTML5 : header, nav, section, details et summary
Entraînement 01 / 04

Drill WB-E.1 — balises de structure HTML5 : header, nav, section, details et summary

5 questionsCorrigé masqué

Voici le code HTML, incomplet, de la page tarifs.html du site VéloCité. Dans le navigateur, le bloc de la ligne 8 apparaît replié avec le titre « Voir les prix » ; un clic sur ce titre déplie la liste des prix.

 1 <body>
 2   ………………………………………
 3     <h1>VéloCité</h1>
 4     <nav> <a href="index.html">Accueil</a> <a href="#tarifs">Tarifs</a> </nav>
 5   </header>
 6   <section id="tarifs">
 7     <h2>Nos formules</h2>
 8     <details>
 9       ………………………………………
10       Journalier : 3 D ; Mensuel : 15 D ; Annuel : 150 D.
11     </details>
12   </section>
13   <footer>VéloCité Sfax - 2026</footer>
14 </body>

Pour chaque question, mettre une croix dans la case correspondant à la proposition correcte.

  1. À la ligne 2, la balise qui ouvre le conteneur du contenu d’introduction (titre et menu) est : ☐ <head> ☐ <header> ☐ <nav>
  2. À la ligne 9, pour que le bloc replié affiche le titre « Voir les prix » au lieu de « Détails », on écrit : ☐ <title>Voir les prix</title> ☐ <legend>Voir les prix</legend> ☐ <summary>Voir les prix</summary>
  3. La balise <section> de la ligne 6 : ☐ définit le pied de la page ☐ regroupe un contenu thématique de la page (ici les formules) ☐ définit le menu de navigation
  4. La balise <nav> de la ligne 4 : ☐ regroupe les liens de navigation ☐ crée une liste déroulante ☐ insère une barre de défilement
  5. Répondre par V ou F : a. <head> et <header> ont le même rôle ; b. <footer> doit être placé dans <head> ; c. au chargement de la page, le texte de la ligne 10 reste caché tant que l’utilisateur n’a pas cliqué sur « Voir les prix ».
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : <head> contient les informations sur la page (jamais affichées), <header> est l’en-tête visible. Réponse : <header> — la ligne 5 le ferme déjà (</header>).

2. <summary>Voir les prix</summary> : premier enfant de <details>, il fournit le titre cliquable du bloc repliable. <title> donne le titre de la page (onglet), <legend> le titre d’un <fieldset>.

3. Elle regroupe un contenu thématique de la page, ici les formules d’abonnement ; le pied de page est <footer>.

4. Elle regroupe les liens de navigation (Accueil, Tarifs).

5. a. F : <head> n’est pas affiché, <header> est un bloc visible du corps de la page. b. F : <footer> appartient au corps (<body>), ici ligne 13. c. V : le contenu de <details> autre que <summary> est replié par défaut.

2 Drill WB-E.2 — seuls les champs nommés du formulaire sont envoyés au serveur
Entraînement 02 / 04

Drill WB-E.2 — seuls les champs nommés du formulaire sont envoyés au serveur

5 questionsCorrigé masqué

La page location.html du site VéloCité permet de réserver un vélo. La fonction JavaScript calculer() affiche, dans l’élément de la ligne 9, le montant estimé : durée × tarif par minute, ce tarif étant de 0,050 D.

 1 <form action="location.php" method="post" onsubmit="return verifier()">
 2   <label>Station :</label>
 3   <select name="station">
 4     <option value="1">Bab Bhar</option>
 5     <option value="4">Gare</option>
 6   </select><br>
 7   <label>Durée (min) :</label>
 8   <input type="number" id="duree" min="10" max="120" onchange="calculer()"><br>
 9   <label>Montant estimé :</label> <span id="montant">0.000</span> D<br>
10   <input type="text" name="code" id="code" placeholder="Code promo"><br>
11   <input type="hidden" name="tarif" value="0.050">
12   <input type="submit" name="envoi" value="Réserver">
13 </form>
  1. L’utilisateur choisit « Gare », tape 30 dans le champ Durée, laisse le code promo vide, puis clique sur « Réserver » (verifier() renvoie true). Donner la liste des couples « nom = valeur » reçus par location.php.
  2. Quel montant la fonction calculer() affiche-t-elle pour cette durée ?
  3. Pourquoi la durée tapée n’arrive-t-elle pas au serveur ? Réécrire la ligne 8 pour corriger.
  4. Le montant affiché à la ligne 9 n’est pas non plus reçu. Expliquer pourquoi, puis proposer une balise à ajouter au formulaire et l’instruction à ajouter à calculer() pour que ce montant soit envoyé, sans être modifiable par l’utilisateur.
  5. Quel est le rôle de la ligne 11 ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : le navigateur n’envoie que les champs de formulaire (input, select, textarea) qui possèdent un attribut name. location.php reçoit : station = 4 (la value de l’option « Gare »), code = (chaîne vide : un champ texte vide est envoyé), tarif = 0.050, envoi = Réserver (le bouton submit nommé qui a servi à l’envoi).

2. 30 × 0,050 = 1,500 D, affiché « 1.500 ».

3. Le champ de la ligne 8 n’a pas d’attribut name : il est affiché et lu par calculer() (par son id), mais il n’est pas transmis. Correction :

  <input type="number" id="duree" name="duree" min="10" max="120" onchange="calculer()"><br>

4. <span> n’est pas un champ de formulaire : son contenu n’est jamais envoyé, même s’il est placé dans <form>. On ajoute un champ caché nommé, rempli par le script :

<input type="hidden" name="montant" id="mt">

et, dans calculer(), après le calcul de la variable m qui contient le montant : document.getElementById("mt").value = m.

5. La ligne 11 transmet au serveur le tarif par minute (0.050) sans l’afficher : l’utilisateur ne le voit ni ne le saisit.

3 Drill WB-E.3 — liste déroulante : la valeur envoyée est celle de l’option, pas son texte
Entraînement 03 / 04

Drill WB-E.3 — liste déroulante : la valeur envoyée est celle de l’option, pas son texte

5 questionsCorrigé masqué

On considère le formulaire suivant de la page modeles.html (site VéloCité).

 1 <form action="modele.php" method="get">
 2   <select name="modele">
 3     <option value="M1">Urbain 3V</option>
 4     <option value="M5">E-City</option>
 5     <option>E-Trek</option>
 6   </select>
 7   <select id="duree">
 8     <option value="1">1 jour</option>
 9     <option value="30" selected>1 mois</option>
10   </select>
11   <input type="submit" value="Voir le tarif">
12 </form>
  1. Quelle option est sélectionnée dans chaque liste au chargement de la page ?
  2. L’utilisateur choisit « E-City » puis clique sur le bouton. Quelle adresse est demandée au serveur ? Justifier la présence des données dans l’adresse.
  3. Même question si l’utilisateur choisit « E-Trek ».
  4. La page modele.php attend aussi la durée, sous le nom duree. Réécrire la ligne 7, puis donner l’adresse demandée pour « E-City » et « 1 mois ».
  5. On remplace method="get" par method="post". Qu’est-ce qui change pour l’utilisateur ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Première liste : Urbain 3V (sans attribut selected, la première option est sélectionnée). Seconde liste : 1 mois (attribut selected).

2. Idée : c’est la value de l’option choisie qui part, associée au name de la liste. Adresse : modele.php?modele=M5. Avec method="get", les couples nom=valeur sont ajoutés à l’URL après « ? ». La durée n’apparaît pas : la seconde liste n’a pas de name.

3. L’option « E-Trek » n’a pas d’attribut value : c’est son texte qui est envoyé → modele.php?modele=E-Trek.

4.

  <select id="duree" name="duree">

Adresse : modele.php?modele=M5&duree=30 (les couples sont séparés par « & »).

5. Les données ne sont plus visibles dans la barre d’adresse : elles sont transmises dans le corps de la requête HTTP. Les valeurs reçues par le serveur (M5, 30) ne changent pas.

4 Drill WB-E.4 — l’en-tête head : title, meta charset et meta description
Entraînement 04 / 04

Drill WB-E.4 — l’en-tête head : title, meta charset et meta description

5 questionsCorrigé masqué

Voici le début du code HTML de la page index.html du site VéloCité.

1 <!DOCTYPE html>
2 <html lang="fr">
3 <head>
4   <meta description="Location de vélos à Sfax">
5   <title>VéloCité - Accueil</title>
6   <link rel="stylesheet" href="styleVelo.css">
7   <script src="controleVelo.js"></script>
8 </head>
  1. Où s’affiche le texte de la ligne 5 ?
  2. Dans le navigateur, le titre s’affiche « VéloCité » au lieu de « VéloCité ». Quelle balise faut-il ajouter dans <head> ?
  3. La ligne 4 devait fournir aux moteurs de recherche une description de la page, mais elle est mal écrite. La réécrire.
  4. Le fichier controleVelo.js est déplacé dans un dossier js situé dans le même dossier que index.html. Réécrire la ligne 7.
  5. Répondre par V ou F : a. le contenu de <head> s’affiche dans la page ; b. l’attribut lang="fr" (ligne 2) indique la langue du contenu de la page.
Voir la correction commentéeAprès avoir posé votre démarche

1. <title> donne le titre de la page : il s’affiche dans l’onglet (ou la barre de titre) du navigateur et sert de titre dans les favoris et les résultats des moteurs de recherche.

2. Idée : les caractères accentués mal affichés trahissent un encodage non déclaré. On ajoute <meta charset="utf-8"> dans <head>.

3. Une balise meta de description associe le nom description à un contenu :

  <meta name="description" content="Location de vélos à Sfax">

4. Le chemin est relatif à la page : <script src="js/controleVelo.js"></script>.

5. a. F : <head> décrit la page (titre, encodage, liens vers les feuilles de style et les scripts) sans rien afficher dans le corps. b. V.

Relier ce raisonnement au bac

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