<?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/>
(<code>&lt;form&gt;</code>, <code>&lt;input&gt;</code>, <code>&lt;button&gt;</code>, <code>&lt;select&gt;</code>), 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 : <code>click</code>, <code>dblclick</code>,<br/>
<code>mousedown</code>, <code>mouseup</code>, <code>mousemove</code>,<br/>
<code>mouseenter</code>, <code>mouseleave</code>. Idem au clavier :<br/>
<code>keydown</code>, <code>keyup</code>, <code>keypress</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><code>mouseDown</code></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><code>onclick</code></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><code>click</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>click</code> est le nom<br/>
standard. Pour l'écouter :<br/>
<code>el.addEventListener("click", ...)</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>tap</code></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/>
<code>action</code> quand l'utilisateur soumet (par<br/>
clic sur <code>&lt;button type="submit"&gt;</code> 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><code>&lt;send&gt;</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>&lt;form&gt;</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>&lt;form&gt;</code> regroupe les<br/>
champs et permet de les soumettre<br/>
ensemble. Attributs clés : <code>action</code><br/>
(URL), <code>method</code> (GET/POST).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>&lt;input&gt;</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>&lt;input&gt;</code> est un <strong>champ</strong> de<br/>
formulaire, pas un conteneur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>&lt;formulaire&gt;</code></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'<code>&lt;input&gt;</code> : <code>text</code>,<br/>
<code>password</code>, <code>email</code>, <code>number</code>, <code>date</code>,<br/>
<code>checkbox</code>, <code>radio</code>, <code>submit</code>, <code>file</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><code>&lt;textbox&gt;</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>&lt;text /&gt;</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>&lt;input type="text"&gt;</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>&lt;input&gt;</code> est polyvalente,<br/>
<code>type</code> détermine son apparence et son<br/>
comportement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>&lt;entry&gt;</code></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 : <code>submit</code><br/>
(soumission, par défaut dans <code>&lt;form&gt;</code>),<br/>
<code>reset</code> (réinitialise les champs), <code>button</code><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><code>&lt;button type="submit"&gt;Envoyer&lt;/button&gt;</code> (ou <code>&lt;input type="submit" value="Envoyer"&gt;</code>)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>&lt;button&gt;</code> est plus<br/>
flexible (peut contenir du HTML, des<br/>
icônes). <code>&lt;input type="submit"&gt;</code> est<br/>
historique mais valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>&lt;a&gt;Envoyer&lt;/a&gt;</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>&lt;a&gt;</code> est un <strong>lien</strong>, pas un<br/>
bouton de soumission.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>&lt;click&gt;Envoyer&lt;/click&gt;</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>&lt;send&gt;Envoyer&lt;/send&gt;</code></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 : <code>&lt;datalist&gt;</code> (suggestions sur un<br/>
champ texte), <code>multiple</code> sur <code>&lt;select&gt;</code><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><code>&lt;list&gt;</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>&lt;select&gt;</code> contenant des <code>&lt;option&gt;</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>&lt;select&gt;</code> est le<br/>
conteneur, chaque choix est une <code>&lt;option<br/>
value="..."&gt;texte&lt;/option&gt;</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>&lt;dropdown&gt;</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>&lt;combo&gt;</code></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 <code>&lt;label&gt;</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique RGAA/WCAG : tout champ doit<br/>
avoir un <code>&lt;label&gt;</code> 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/>
<code>&lt;label for="nomChamp"&gt;...&lt;/label&gt;</code> et<br/>
<code>&lt;input id="nomChamp"&gt;</code>.</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 <code>&lt;strong&gt;</code> ou <code>&lt;b&gt;</code>.</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 <code>&lt;h1&gt;</code>...<code>&lt;h6&gt;</code>.</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/>
<code>&lt;label&gt;</code> 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/>
<code>event.preventDefault()</code> 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><code>send</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : événement inexistant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>submit</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : événement <code>submit</code><br/>
déclenché sur le <code>&lt;form&gt;</code>. À écouter pour<br/>
intercepter la soumission (validation<br/>
côté client, AJAX...).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>change</code></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><code>click</code></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/>
<code>submit</code>.</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><code>name</code></strong> essentiel : c'est sous<br/>
ce nom que la donnée arrive côté serveur.<br/>
Sans <code>name</code>, 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[<pre><code>&lt;input type="text"&gt;</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Insuffisant : pas de <code>&lt;form&gt;</code>, pas de<br/>
bouton.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>&lt;form&gt;Nom: &lt;input&gt;&lt;/form&gt;</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Trop minimal : ni <code>name</code>, ni méthode, ni<br/>
bouton.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>&lt;send name="nom" /&gt;</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>&lt;form action="/save" method="POST"&gt;
  &lt;label for="nom"&gt;Nom :&lt;/label&gt;
  &lt;input id="nom" name="nom" type="text"&gt;
  &lt;button type="submit"&gt;Envoyer&lt;/button&gt;
&lt;/form&gt;</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>&lt;form&gt;</code> avec action et<br/>
method, <code>&lt;label&gt;</code> lié à <code>&lt;input&gt;</code> par<br/>
<code>for</code>/<code>id</code>, <code>name</code> (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 <code>handleClick</code> au<br/>
clic sur le bouton <code>btn</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Avantages d'<code>addEventListener</code> sur<br/>
<code>onclick = </code> : possibilité d'attacher<br/>
<strong>plusieurs</strong> gestionnaires, options<br/>
avancées (<code>once</code>, <code>capture</code>, <code>passive</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><code>btn.onclick(handleClick)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>onclick</code> est une <strong>propriété</strong>,<br/>
pas une méthode. Il faut écrire<br/>
<code>btn.onclick = handleClick</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>btn.click(handleClick)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>btn.click()</code> <strong>déclenche</strong> le<br/>
clic, ne l'écoute pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>btn.addEventListener("click", handleClick)</code></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><code>btn.handle("click", handleClick)</code></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/>
<code>&lt;input id="nom"&gt;</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour modifier aussi : <code>el.value =<br/>
"nouveau"</code>. Pour les cases à cocher et les<br/>
boutons radio : <code>el.checked</code> (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><code>document.getElementById("nom").text</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est <code>value</code>, pas <code>text</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>document.getElementById("nom").innerHTML</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>innerHTML</code> 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><code>document.getElementById("nom").content</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : propriété inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>document.getElementById("nom").value</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>value</code> est la propriété<br/>
standard pour les champs de formulaire<br/>
(<code>&lt;input&gt;</code>, <code>&lt;select&gt;</code>, <code>&lt;textarea&gt;</code>).</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 <code>event.preventDefault()</code> 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/>
<pre><code>form.addEventListener("submit", e =&gt; {
  if (!valider()) e.preventDefault();
});</code></pre></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 (<code>&lt;a&gt;</code>) 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 <code>window.close()</code>.<br/>
La méthode <code>preventDefault</code><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/>
<code>console.clear()</code>. La<br/>
méthode <code>preventDefault</code><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/>
<code>min</code>, <code>max</code>, <code>minlength</code>, <code>maxlength</code>,<br/>
<code>pattern</code> (expression régulière), <code>type="email"</code>, 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 <code>mandatory="true"</code></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 <code>required</code> : <code>&lt;input required&gt;</code></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 <code>must-fill</code></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'<code>&lt;input&gt;</code> est le plus adapté<br/>
pour un champ « Âge » ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Choisir le bon <code>type</code> 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><code>type="number"</code></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><code>type="text"</code></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><code>type="email"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour un courriel.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>type="age"</code></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 <code>event.target</code> (où l'événement<br/>
s'est produit) vs <code>event.currentTarget</code><br/>
(où le gestionnaire est attaché). Pour la<br/>
délégation d'événements, on utilise<br/>
<code>target</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><code>event.dom</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : propriété inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>this.element</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>this</code> 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><code>event.target</code></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><code>event.element</code></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 <code>name</code> est-il important<br/>
pour un <code>&lt;input&gt;</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Distinction triple : <code>id</code> (unique, pour CSS<br/>
et JS), <code>class</code> (pour CSS et JS, partagé),<br/>
<code>name</code> (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 <code>&lt;label&gt;</code>.</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 <code>name</code>, le champ<br/>
n'est <strong>pas envoyé</strong> au serveur. Le<br/>
serveur reçoit <code>nom=Alice&amp;age=17</code> à<br/>
partir des <code>name</code>.</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é : <code>&lt;textarea&gt;</code> n'est pas<br/>
auto-fermante, et son contenu initial<br/>
est entre les balises (pas un attribut<br/>
<code>value</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><code>&lt;paragraph contenteditable&gt;</code></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><code>&lt;textarea&gt;contenu initial&lt;/textarea&gt;</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : balise dédiée. Attributs<br/>
utiles : <code>rows</code>, <code>cols</code>, <code>placeholder</code>,<br/>
<code>maxlength</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>&lt;text&gt;multiligne&lt;/text&gt;</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>&lt;input type="text" multiline&gt;</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>multiline</code> n'existe pas comme<br/>
attribut de <code>&lt;input&gt;</code>.</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/>
<code>input</code> et <code>change</code> sur un <code>&lt;input type="text"&gt;</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Choix selon le besoin : aperçu en direct →<br/>
<code>input</code> ; validation à la fin → <code>change</code> ;<br/>
soumission complète → <code>submit</code> (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><code>input</code> se déclenche à chaque modification (chaque touche), <code>change</code> seulement quand le champ perd le focus avec une nouvelle valeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>input</code> est plus<br/>
réactif (auto-complétion en temps réel),<br/>
<code>change</code> plus économe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>change</code> plante toujours</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'évènement <code>change</code><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><code>input</code> 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/>
<code>/save</code>, 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 (<code>fetch</code> 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/>
<code>action</code> 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 <code>/save</code> 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 <code>event.target</code> 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 <code>onclick</code> à 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 <code>addEventListener</code> 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 <code>name</code> manque sur l'<code>&lt;input&gt;</code> (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/>
<code>&lt;input id="nom"&gt;</code> ne suffit pas ; il<br/>
faut <code>&lt;input name="nom"&gt;</code> (l'<code>id</code> 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/>
<code>SameSite</code> 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 <code>addEventListener</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
exacte : <code>addEventListener</code><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 <code>name</code> d'un champ est essentiel pour la soumission au serveur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : sans <code>name</code>, 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 <code>type</code> 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/>
<code>email</code>, <code>tel</code>, <code>url</code>, <code>number</code>, <code>date</code>, <code>color</code>,<br/>
<code>password</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><code>type="contact"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>contact</code> 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><code>type="email"</code></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 <code>@</code>), affiche un clavier adapté sur<br/>
mobile et améliore l'accessibilité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>type="text"</code></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><code>type="address"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun type <code>address</code> n'est défini par<br/>
le standard HTML. Le type spécifique aux<br/>
adresses électroniques est <code>email</code>.</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 HTML$5$ 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/>
<code>pattern="..."</code> (motif d'expression régulière à respecter),<br/>
<code>minlength</code>/<code>maxlength</code> (longueur de la chaîne),<br/>
<code>min</code>/<code>max</code> (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><code>obligatoire</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les attributs HTML sont en anglais.<br/>
Le bon attribut est <code>required</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>empty=false</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune syntaxe de ce type n'existe en<br/>
HTML. L'attribut <code>required</code> se passe de<br/>
valeur : sa simple présence suffit.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>required</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : ajouter <code>required</code> à 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><code>mandatory</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun attribut <code>mandatory</code> n'est<br/>
défini dans le standard HTML. C'est <code>required</code><br/>
qui joue ce rôle.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
