<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/Événements et formulaires</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Événements DOM (clic, saisie, soumission), gestion des<br/>
événements en JavaScript, balises de formulaire HTML<br/>
(&lt;form&gt;, &lt;input&gt;, &lt;button&gt;, &lt;select&gt;), méthodes<br/>
HTTP GET et POST, validation côté client.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q01 : Événement</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'un <strong>événement</strong> dans le contexte<br/>
d'une page web ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Modèle « publication-souscription » : les<br/>
éléments <strong>publient</strong> des événements, les<br/>
gestionnaires les <strong>écoutent</strong> et y réagissent.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une modification CSS automatique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une modification CSS<br/>
relève de la mise en<br/>
forme. Un évènement,<br/>
en JavaScript, est un<br/>
signal émis par le<br/>
navigateur ou l'utilisateur,<br/>
auquel le code peut<br/>
réagir.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un fichier média</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un fichier média (image,<br/>
son, vidéo) est une<br/>
ressource statique,<br/>
tandis qu'un évènement<br/>
est un signal dynamique<br/>
déclenché lors de<br/>
l'utilisation de la page.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur de programmation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un bug n'est pas un événement DOM.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une action déclenchée par l'utilisateur (clic, saisie, mouvement souris...) ou par le navigateur (chargement, redimensionnement...)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les événements rendent la<br/>
page <strong>interactive</strong>. JavaScript permet<br/>
d'y réagir.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q02 : Événement de clic</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le nom de l'événement déclenché quand<br/>
l'utilisateur <strong>clique</strong> sur un élément ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Événements souris : click, dblclick,<br/>
mousedown, mouseup, mousemove,<br/>
mouseenter, mouseleave. Idem au clavier :<br/>
keydown, keyup, keypress.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>mouseDown</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est un <strong>autre</strong> événement (pression<br/>
du bouton, sans relâcher).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>onclick</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est l'attribut/propriété d'écoute, pas<br/>
le nom de l'événement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>click</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : click est le nom<br/>
standard. Pour l'écouter :<br/>
el.addEventListener("click", ...).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>tap</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est un événement tactile, distinct.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q03 : Balise form</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle balise HTML délimite un <strong>formulaire</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le formulaire envoie ses données vers<br/>
action quand l'utilisateur soumet (par<br/>
clic sur &lt;button type="submit"&gt; ou en<br/>
validant via Entrée).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;send&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>&lt;form&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : &lt;form&gt; regroupe les<br/>
champs et permet de les soumettre<br/>
ensemble. Attributs clés : action<br/>
(URL), method (GET/POST).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;input&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : &lt;input&gt; est un <strong>champ</strong> de<br/>
formulaire, pas un conteneur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;formulaire&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q04 : Champ texte</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle balise crée un <strong>champ de saisie</strong> texte ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Types courants d'&lt;input&gt; : text,<br/>
password, email, number, date,<br/>
checkbox, radio, submit, file.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;textbox&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;text /&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>&lt;input type="text"&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : &lt;input&gt; est polyvalente,<br/>
type détermine son apparence et son<br/>
comportement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;entry&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q05 : Bouton</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment créer un <strong>bouton</strong> « Envoyer » qui<br/>
soumet le formulaire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trois types de bouton : submit<br/>
(soumission, par défaut dans &lt;form&gt;),<br/>
reset (réinitialise les champs), button<br/>
(générique, à manipuler en JS).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>&lt;button type="submit"&gt;Envoyer&lt;/button&gt; (ou &lt;input type="submit" value="Envoyer"&gt;)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : &lt;button&gt; est plus<br/>
flexible (peut contenir du HTML, des<br/>
icônes). &lt;input type="submit"&gt; est<br/>
historique mais valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;a&gt;Envoyer&lt;/a&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : &lt;a&gt; est un <strong>lien</strong>, pas un<br/>
bouton de soumission.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;click&gt;Envoyer&lt;/click&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;send&gt;Envoyer&lt;/send&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q06 : Liste déroulante</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle balise crée une <strong>liste déroulante</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variantes : &lt;datalist&gt; (suggestions sur un<br/>
champ texte), multiple sur &lt;select&gt;<br/>
(sélection multiple).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;list&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>&lt;select&gt; contenant des &lt;option&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : &lt;select&gt; est le<br/>
conteneur, chaque choix est une &lt;option<br/>
value="..."&gt;texte&lt;/option&gt;.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;dropdown&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;combo&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q07 : Étiquette</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>À quoi sert la balise &lt;label&gt; ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique RGAA/WCAG : tout champ doit<br/>
avoir un &lt;label&gt; associé. Sans label, les<br/>
lecteurs d'écran ne peuvent pas annoncer<br/>
correctement le champ.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>À associer une étiquette explicative à un champ de formulaire (clic sur l'étiquette = focus sur le champ)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : améliore l'<strong>accessibilité</strong><br/>
et l'ergonomie. Lier via<br/>
&lt;label for="nomChamp"&gt;...&lt;/label&gt; et<br/>
&lt;input id="nomChamp"&gt;.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À mettre du texte en gras</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est &lt;strong&gt; ou &lt;b&gt;.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À créer un titre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait &lt;h1&gt;...&lt;h6&gt;.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À étiqueter une variable JavaScript</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une variable JavaScript<br/>
n'a pas d'étiquette<br/>
accessible aux lecteurs<br/>
d'écran. La balise<br/>
&lt;label&gt; agit sur la<br/>
structure du formulaire<br/>
HTML, pas sur le code.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q08 : Soumission</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel événement se déclenche quand un<br/>
<strong>formulaire est soumis</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour empêcher la soumission par défaut<br/>
(par exemple pour valider en JS) :<br/>
event.preventDefault() dans le<br/>
gestionnaire.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>send</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : événement inexistant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>submit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : événement submit<br/>
déclenché sur le &lt;form&gt;. À écouter pour<br/>
intercepter la soumission (validation<br/>
côté client, AJAX...).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>change</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est un autre événement (changement de<br/>
valeur d'un champ).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>click</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le clic sur le bouton déclenche click,<br/>
mais l'événement de soumission est<br/>
submit.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q09 : GET ou POST ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle méthode HTTP utilise-t-on pour<br/>
<strong>envoyer un mot de passe</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle pratique : GET pour récupérer des<br/>
données (recherche, lecture), POST pour<br/>
modifier l'état du serveur (création, envoi<br/>
de formulaire).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune des deux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pour transmettre un mot<br/>
de passe, on choisit<br/>
systématiquement la<br/>
méthode POST, qui place<br/>
les données dans le corps<br/>
de la requête plutôt que<br/>
dans l'URL.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>POST, parce que les données sont dans le corps de la requête, pas dans l'URL</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : POST est plus discret.<br/>
Pour les données sensibles, utiliser<br/>
POST + HTTPS.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>GET, parce que c'est plus rapide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : GET met les données dans l'URL,<br/>
ce qui est <strong>visible</strong> et logué dans<br/>
l'historique. À éviter pour les données<br/>
sensibles.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>PUT, c'est obligatoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : PUT a un autre rôle (mise à jour<br/>
d'une ressource REST).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q10 : Formulaire complet</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Lequel de ces fragments est un <strong>formulaire<br/>
valide</strong> demandant un nom et l'envoyant en<br/>
POST ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Attribut <strong>name</strong> essentiel : c'est sous<br/>
ce nom que la donnée arrive côté serveur.<br/>
Sans name, le champ n'est <strong>pas envoyé</strong>.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>html<br/>
&lt;input type="text"&gt;<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Insuffisant : pas de &lt;form&gt;, pas de<br/>
bouton.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>html<br/>
&lt;form&gt;Nom: &lt;input&gt;&lt;/form&gt;<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Trop minimal : ni name, ni méthode, ni<br/>
bouton.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>html<br/>
&lt;send name="nom" /&gt;<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>html<br/>
&lt;form action="/save" method="POST"&gt;<br/>
  &lt;label for="nom"&gt;Nom :&lt;/label&gt;<br/>
  &lt;input id="nom" name="nom" type="text"&gt;<br/>
  &lt;button type="submit"&gt;Envoyer&lt;/button&gt;<br/>
&lt;/form&gt;<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : &lt;form&gt; avec action et<br/>
method, &lt;label&gt; lié à &lt;input&gt; par<br/>
for/id, name (essentiel pour<br/>
identifier la donnée envoyée), bouton<br/>
submit.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q11 : Gestionnaire d'événement</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code attache la fonction handleClick au<br/>
clic sur le bouton btn ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Avantages d'addEventListener sur<br/>
onclick =  : possibilité d'attacher<br/>
<strong>plusieurs</strong> gestionnaires, options<br/>
avancées (once, capture, passive).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>btn.onclick(handleClick)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : onclick est une <strong>propriété</strong>,<br/>
pas une méthode. Il faut écrire<br/>
btn.onclick = handleClick.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>btn.click(handleClick)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : btn.click() <strong>déclenche</strong> le<br/>
clic, ne l'écoute pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>btn.addEventListener("click", handleClick)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : forme moderne et<br/>
recommandée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>btn.handle("click", handleClick)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : méthode inexistante.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q12 : Lire la valeur d'un champ</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment récupérer la valeur tapée dans<br/>
&lt;input id="nom"&gt; ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour modifier aussi : el.value =<br/>
"nouveau". Pour les cases à cocher et les<br/>
boutons radio : el.checked (booléen).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>document.getElementById("nom").text</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est value, pas text.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>document.getElementById("nom").innerHTML</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : innerHTML est pour le contenu<br/>
HTML d'éléments génériques, pas pour les<br/>
champs de formulaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>document.getElementById("nom").content</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : propriété inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>document.getElementById("nom").value</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : value est la propriété<br/>
standard pour les champs de formulaire<br/>
(&lt;input&gt;, &lt;select&gt;, &lt;textarea&gt;).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q13 : preventDefault</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>À quoi sert event.preventDefault() dans un<br/>
gestionnaire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cas typique : valider un formulaire en JS<br/>
avant de le soumettre.<br/>
`<code>js<br/>
form.addEventListener("submit", e =&gt; {<br/>
  if (!valider()) e.preventDefault();<br/>
});<br/>
</code>`</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À empêcher tout événement futur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : seulement le comportement par<br/>
défaut de l'événement courant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>À empêcher le comportement par défaut du navigateur (par exemple, ne pas soumettre le formulaire pour le traiter en JS)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : très utile pour<br/>
intercepter une soumission ou un clic<br/>
sur un lien (&lt;a&gt;) afin de gérer<br/>
l'action en JavaScript.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À fermer la page</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fermeture d'une page<br/>
se demande via window.close().<br/>
La méthode preventDefault<br/>
ne ferme rien : elle annule<br/>
uniquement l'action par<br/>
défaut associée à un<br/>
évènement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À effacer la console</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'effacement de la<br/>
console se fait avec<br/>
console.clear(). La<br/>
méthode preventDefault<br/>
n'agit que sur l'évènement<br/>
en cours, pas sur les<br/>
outils du navigateur.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q14 : Validation HTML5</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment indiquer qu'un champ est<br/>
<strong>obligatoire</strong> dans le HTML ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Autres attributs de validation HTML5 :<br/>
min, max, minlength, maxlength,<br/>
pattern (expression régulière), type="email", etc.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec mandatory="true"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : attribut inexistant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec l'attribut required : &lt;input required&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : validation native du<br/>
navigateur, qui empêche la soumission si<br/>
le champ est vide. Affichage d'un message<br/>
standard automatiquement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec must-fill</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : attribut inexistant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il faut une fonction JavaScript</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Possible mais HTML5 offre des<br/>
validations natives plus simples.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q15 : Type d'input adapté</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel <strong>type</strong> d'&lt;input&gt; est le plus adapté<br/>
pour un champ « Âge » ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Choisir le bon type améliore l'ergonomie<br/>
(clavier mobile adapté), accessibilité et<br/>
validation. Ne pas négliger ces<br/>
« petits détails ».</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>type="number"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : restreint à des nombres,<br/>
affiche des flèches haut/bas, ouvre un<br/>
clavier numérique sur mobile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>type="text"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Possible mais peu pratique. L'utilisateur<br/>
pourrait taper du texte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>type="email"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour un courriel.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>type="age"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : type inexistant.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q16 : Cible de l'événement</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans un gestionnaire d'événement, comment<br/>
accéder à l'<strong>élément</strong> sur lequel l'événement<br/>
a eu lieu ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Distinction event.target (où l'événement<br/>
s'est produit) vs event.currentTarget<br/>
(où le gestionnaire est attaché). Pour la<br/>
délégation d'événements, on utilise<br/>
target.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>event.dom</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : propriété inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>this.element</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : this peut référencer<br/>
l'élément, mais selon le contexte<br/>
(fonction fléchée vs régulière), il<br/>
peut ne pas marcher.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>event.target</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : référence l'élément<br/>
ayant déclenché l'événement. Permet de<br/>
partager un même gestionnaire entre<br/>
plusieurs éléments.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>event.element</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : propriété inexistante.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q17 : Attribut name</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi l'attribut name est-il important<br/>
pour un &lt;input&gt; ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Distinction triple : id (unique, pour CSS<br/>
et JS), class (pour CSS et JS, partagé),<br/>
name (pour la soumission du formulaire).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour le validateur HTML</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Indirectement, mais le rôle principal est<br/>
autre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour le nom affiché</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le rôle de &lt;label&gt;.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce qu'il identifie la donnée lors de l'envoi du formulaire (clé dans la requête HTTP)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : sans name, le champ<br/>
n'est <strong>pas envoyé</strong> au serveur. Le<br/>
serveur reçoit nom=Alice&amp;age=17 à<br/>
partir des name.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour la couleur du champ</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est CSS.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q18 : Zone de texte</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle balise crée une <strong>zone de texte<br/>
multiligne</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Particularité : &lt;textarea&gt; n'est pas<br/>
auto-fermante, et son contenu initial<br/>
est entre les balises (pas un attribut<br/>
value).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;paragraph contenteditable&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Possible mais usage avancé, pas un<br/>
formulaire classique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>&lt;textarea&gt;contenu initial&lt;/textarea&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : balise dédiée. Attributs<br/>
utiles : rows, cols, placeholder,<br/>
maxlength.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;text&gt;multiligne&lt;/text&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;input type="text" multiline&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : multiline n'existe pas comme<br/>
attribut de &lt;input&gt;.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q19 : Événement input vs change</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence entre les événements<br/>
input et change sur un &lt;input type="text"&gt; ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Choix selon le besoin : aperçu en direct →<br/>
input ; validation à la fin → change ;<br/>
soumission complète → submit (sur le<br/>
formulaire).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>input se déclenche à chaque modification (chaque touche), change seulement quand le champ perd le focus avec une nouvelle valeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : input est plus<br/>
réactif (auto-complétion en temps réel),<br/>
change plus économe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>change plante toujours</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'évènement change<br/>
fonctionne parfaitement<br/>
et n'a aucune raison<br/>
structurelle d'échouer.<br/>
Il sert simplement à<br/>
réagir lorsque la<br/>
nouvelle valeur est<br/>
confirmée par l'utilisateur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : différence de fréquence.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>input n'existe pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : événement standard.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q20 : Requête HTTP</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quand on soumet un formulaire en POST vers<br/>
/save, que se passe-t-il <strong>côté<br/>
navigateur</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'AJAX (Asynchronous JavaScript And XML)<br/>
permet d'envoyer la requête en arrière-plan<br/>
et de mettre à jour la page sans la<br/>
recharger. Schéma moderne (fetch API).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le navigateur ouvre un autre site</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le navigateur ne quitte<br/>
pas le domaine courant<br/>
de sa propre initiative.<br/>
Il envoie simplement<br/>
une requête vers l'URL<br/>
indiquée par l'attribut<br/>
action du formulaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le formulaire reste affiché</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas par défaut : la page <strong>change</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le navigateur envoie une requête HTTP POST vers /save avec les données dans le corps, puis affiche la réponse du serveur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est le mécanisme<br/>
fondamental du formulaire. Sans<br/>
JavaScript, la page change. Avec JS, on<br/>
peut intercepter pour faire de l'AJAX<br/>
(sans rechargement).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Rien</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la soumission est l'action<br/>
principale.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q21 : Validation client vs serveur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Faut-il valider les données d'un formulaire<br/>
<strong>côté client</strong> (JavaScript), <strong>côté serveur</strong><br/>
ou les deux ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Mantra de sécurité : « Never trust user<br/>
input. » La validation côté client améliore<br/>
l'expérience, mais la validation côté<br/>
serveur est <strong>non négociable</strong>.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune des deux : faire confiance</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : recette pour les bugs et failles.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les deux : côté client pour l'ergonomie (retour immédiat), côté serveur pour la sécurité (autorité)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : règle d'or. Toute<br/>
donnée venant du client est suspecte<br/>
jusqu'à validation par le serveur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Côté serveur uniquement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Possible mais peu ergonomique :<br/>
l'utilisateur doit attendre la réponse<br/>
du serveur pour voir une erreur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Côté client uniquement (plus rapide)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la validation client peut être<br/>
contournée (l'utilisateur peut<br/>
désactiver JS, modifier le HTML,<br/>
envoyer une requête falsifiée). Pas de<br/>
sécurité.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q22 : Délégation d'événements</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On a une liste de 100 boutons. Quelle est la<br/>
<strong>meilleure</strong> façon d'écouter leurs clics ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Modèle de délégation : « les événements<br/>
remontent (bubble) », donc on peut les<br/>
attraper en haut. Cas typique : liste<br/>
d'éléments dynamiques.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Utiliser une variable globale</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une variable globale ne<br/>
sert pas à intercepter<br/>
des évènements. La bonne<br/>
approche reste la<br/>
délégation : un seul<br/>
gestionnaire posé sur<br/>
le parent commun.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Attacher un seul écouteur sur le parent et utiliser event.target pour identifier le bouton cliqué (« délégation d'événements »)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : schéma recommandé.<br/>
Avantages : un seul gestionnaire,<br/>
fonctionne pour les boutons ajoutés<br/>
dynamiquement après coup.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Modifier le HTML pour ajouter onclick à chaque bouton</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 100 attributs onclick = code<br/>
fragile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Mettre addEventListener sur chacun des 100 boutons</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Fonctionne mais coûteux en mémoire et à<br/>
maintenir, surtout si la liste change<br/>
dynamiquement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q23 : Bug formulaire</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Mon formulaire en POST envoie au serveur, mais<br/>
le champ « nom » est <strong>vide</strong> côté serveur.<br/>
Quelle est la cause la plus probable ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Réflexe de débogage : ouvrir l'onglet<br/>
Network des outils développeur, regarder la<br/>
requête envoyée et son contenu (« Form<br/>
Data »).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>L'attribut name manque sur l'&lt;input&gt; (donc le champ n'est pas inclus dans la requête)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est le piège classique.<br/>
&lt;input id="nom"&gt; ne suffit pas ; il<br/>
faut &lt;input name="nom"&gt; (l'id n'est<br/>
pas envoyé).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le bouton submit est cassé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Possible mais peu probable si la requête<br/>
arrive au serveur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le serveur est en panne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Possible mais cela donnerait une autre<br/>
erreur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le navigateur n'autorise pas POST</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : POST est standard.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q24 : Sécurité d'un formulaire</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est l'attaque classique consistant à<br/>
faire <strong>soumettre</strong> un formulaire à un<br/>
utilisateur <strong>à son insu</strong> sur un autre site ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trois grandes attaques web : XSS<br/>
(injection de script), CSRF (requêtes<br/>
forgées), SQLi (injection SQL).<br/>
Connaissance essentielle pour développer<br/>
sereinement.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>SQL injection</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Existe, mais concerne les bases de<br/>
données.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>CSRF (Cross-Site Request Forgery)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un site malveillant<br/>
incite l'utilisateur (déjà authentifié<br/>
ailleurs) à faire une requête vers le<br/>
site légitime, exploitant ses cookies.<br/>
Protection : tokens CSRF, attribut<br/>
SameSite sur les cookies.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Spam</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas le terme technique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>XSS (Cross-Site Scripting)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Existe, mais c'est une attaque par<br/>
injection de script, différente.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes, laquelle<br/>
est <strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Mnémonique sécurité : « Never trust user<br/>
input + always use HTTPS pour les données<br/>
sensibles ».</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La méthode HTTP GET est préférable pour transmettre un mot de passe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : GET met les<br/>
données dans l'URL (visibles, loguées).<br/>
Pour un mot de passe, utiliser POST sur<br/>
HTTPS.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toute donnée client doit être revalidée côté serveur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : règle d'or de sécurité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un événement DOM peut être écouté avec addEventListener</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
exacte : addEventListener<br/>
est la méthode standard<br/>
pour attacher un<br/>
gestionnaire à un<br/>
évènement. Ce n'est<br/>
donc pas la mauvaise<br/>
affirmation recherchée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'attribut name d'un champ est essentiel pour la soumission au serveur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : sans name, pas envoyé.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q26 : Type d'input pour une adresse e-mail</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel attribut type choisir pour un champ destiné à<br/>
la saisie d'une adresse électronique ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Choisir le bon type apporte un triple bénéfice :<br/>
validation native du navigateur, clavier adapté<br/>
sur mobile, et meilleure information aux<br/>
technologies d'assistance. Quelques types utiles :<br/>
email, tel, url, number, date, color,<br/>
password.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>type="contact"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : contact n'est pas un type d'input<br/>
valide. La liste exhaustive des types est<br/>
fixée par le standard HTML.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>type="email"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : ce type indique au navigateur<br/>
qu'il s'agit d'une adresse électronique. Cela<br/>
déclenche une validation de base (présence<br/>
d'un @), affiche un clavier adapté sur<br/>
mobile et améliore l'accessibilité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>type="text"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un champ texte fonctionne, mais<br/>
n'apporte aucune validation automatique. On<br/>
perd les vérifications de format et le clavier<br/>
spécialisé sur mobile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>type="address"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun type address n'est défini par<br/>
le standard HTML. Le type spécifique aux<br/>
adresses électroniques est email.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Événements et formulaires — Q27 : Validation côté navigateur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel attribut HTML5 rend un champ de formulaire<br/>
<strong>obligatoire</strong>, en empêchant la soumission tant<br/>
qu'il est vide ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Autres attributs de validation native :<br/>
pattern="..." (motif d'expression régulière à respecter),<br/>
minlength/maxlength (longueur de la chaîne),<br/>
min/max (valeur numérique ou date). La<br/>
validation côté navigateur n'exempte pas d'une<br/>
revalidation côté serveur.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>obligatoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les attributs HTML sont en anglais.<br/>
Le bon attribut est required.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>empty=false</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune syntaxe de ce type n'existe en<br/>
HTML. L'attribut required se passe de<br/>
valeur : sa simple présence suffit.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>required</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : ajouter required à un champ<br/>
empêche le navigateur de soumettre le<br/>
formulaire tant qu'il est vide. Un message<br/>
d'erreur s'affiche automatiquement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>mandatory</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun attribut mandatory n'est<br/>
défini dans le standard HTML. C'est required<br/>
qui joue ce rôle.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
