<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/JavaScript et DOM</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Bases de JavaScript pour interagir avec une page web :<br/>
intégration au HTML, syntaxe de base, manipulation du DOM<br/>
(Document Object Model), sélection et modification<br/>
d'éléments, exemples typiques.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q01 : Rôle de JavaScript</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>À quoi sert principalement <strong>JavaScript</strong> dans<br/>
une page web ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trois langages du Web côté navigateur : HTML<br/>
(structure), CSS (style), JavaScript<br/>
(comportement).</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>À mettre en forme les éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est le rôle de CSS.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À envoyer des e-mails</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas son rôle (cela demande un<br/>
serveur).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Rendre la page dynamique et interactive</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : HTML structure, CSS<br/>
embellit, JavaScript fait vivre. Trois<br/>
piliers complémentaires du Web.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À structurer tout le contenu de la page</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est le rôle de HTML.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q02 : Intégrer du JavaScript</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment <strong>inclure</strong> un fichier <code>script.js</code> dans<br/>
une page HTML ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux variantes : script externe (<code>src</code>) ou<br/>
script écrit directement entre<br/>
<code>&lt;script&gt;</code> et <code>&lt;/script&gt;</code>. Le script externe<br/>
facilite la maintenance, car le même<br/>
fichier sert à plusieurs pages.</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;link href="script.js"&gt;</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>&lt;link&gt;</code> est pour les feuilles<br/>
de style.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>&lt;script src="script.js"&gt;&lt;/script&gt;</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : balise <code>&lt;script&gt;</code> avec<br/>
l'attribut <code>src</code>, qui indique le fichier<br/>
à charger.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>&lt;import "script.js"&gt;</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante en HTML.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>&lt;js src="script.js"&gt;&lt;/js&gt;</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q03 : Déclaration de variable</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel mot-clé moderne déclare une variable<br/>
<strong>modifiable</strong> en JavaScript ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux mots-clés modernes : <code>let</code> pour une<br/>
variable modifiable, <code>const</code> pour une<br/>
valeur qu'on ne réaffecte pas.</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>var</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>var</code> déclare aussi une<br/>
variable, mais c'est l'ancien mot-clé ;<br/>
la forme moderne est <code>let</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>Let</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur de casse : les mots-clés<br/>
JavaScript s'écrivent tout en<br/>
minuscules. <code>Let x = 5;</code> provoque une<br/>
SyntaxError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>let</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>let x = 5;</code> déclare une<br/>
variable dont on peut ensuite modifier<br/>
la valeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>int</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : JS n'est pas typé statiquement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q04 : Afficher dans la console</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment <strong>afficher</strong> un message dans la console<br/>
du navigateur en JavaScript ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variantes : <code>console.warn</code>, <code>console.error</code>,<br/>
<code>console.table</code> (pour les objets/tableaux),<br/>
<code>console.dir</code> (pour les éléments DOM).</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>console.log("Hello")</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>console.log</code> est le<br/>
standard. Visible dans l'onglet<br/>
« Console » des outils développeur (F12).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>Console.log("Hello")</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur de casse : JavaScript distingue<br/>
majuscules et minuscules. L'objet<br/>
s'appelle <code>console</code>, tout en minuscules ;<br/>
<code>Console</code> n'est pas défini<br/>
(ReferenceError).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>console.log "Hello"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Parenthèses oubliées : en JavaScript,<br/>
l'appel d'une fonction exige des<br/>
parenthèses autour des arguments. Sans<br/>
elles, SyntaxError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>log("Hello")</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Préfixe oublié : <code>log</code> seul n'est pas<br/>
défini (ReferenceError). C'est une<br/>
méthode de l'objet <code>console</code>, il faut<br/>
donc écrire <code>console.log</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q05 : DOM</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que signifie <strong>DOM</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le DOM est la « porte d'entrée » de<br/>
JavaScript vers la page. Chaque élément HTML<br/>
devient un objet manipulable.</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>Dynamic Output Module</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune spécification ne<br/>
porte ce nom. Le DOM est<br/>
la représentation arborescente<br/>
d'un document HTML, exposée<br/>
aux scripts pour permettre<br/>
la modification dynamique<br/>
de la page.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Display Order Manager</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette dénomination est<br/>
inventée. Le sigle DOM<br/>
renvoie au <em>Document<br/>
Object Model</em>, normalisé<br/>
par le W$3$C dans le cadre<br/>
de la modélisation des<br/>
documents HTML.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Document Object Model</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : représentation<br/>
arborescente de la page HTML, accessible<br/>
et modifiable depuis JavaScript via des<br/>
objets et des méthodes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Domain Object Method</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette appellation n'est<br/>
pas standard. Le sigle<br/>
DOM, défini par le W$3$C,<br/>
signifie <em>Document Object<br/>
Model</em> : il décrit la<br/>
structure d'un document<br/>
HTML sous forme d'arbre<br/>
d'objets.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q06 : Sélection par id</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment récupérer en JavaScript l'élément ayant<br/>
<code>id="titre"</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Alternative moderne et flexible :<br/>
<code>document.querySelector("#titre")</code> (accepte<br/>
tout sélecteur CSS).</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>getElementById(titre)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il manque <code>document.</code> et les<br/>
guillemets autour de la chaîne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>document.find("#titre")</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>document</code> ne possède pas de<br/>
méthode <code>find</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>document.getId("titre")</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : méthode inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>document.getElementById("titre")</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : méthode classique. Renvoie<br/>
l'objet DOM correspondant ou <code>null</code> si<br/>
l'id n'existe pas.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q07 : Modifier le texte</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment changer le <strong>texte</strong> d'un élément <code>el</code><br/>
sélectionné par DOM ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>textContent</code> affiche un texte tel quel,<br/>
balises comprises ; <code>innerHTML</code> interprète<br/>
les balises contenues dans la chaîne.</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>el.value = "..."</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>value</code> concerne les champs de<br/>
formulaire (<code>&lt;input&gt;</code>, <code>&lt;select&gt;</code>).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>el.text = "..."</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>el.textContent = "..."</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>textContent</code> modifie le<br/>
contenu textuel. Pour insérer du HTML<br/>
(avec balises), on utilise <code>innerHTML</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>el.changeText("...")</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : méthode inexistante.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q08 : DOM comme arbre</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle structure de données est utilisée pour<br/>
modéliser le DOM ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Vocabulaire : nœud parent, nœud enfant,<br/>
frère, racine, feuille. Chaque élément du<br/>
DOM est un <strong>nœud</strong>, qui peut être de type<br/>
« élément », « texte », « attribut », 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>Un graphe orienté avec plusieurs cycles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un arbre n'a pas de cycles.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un arbre dont la racine est <code>&lt;html&gt;</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : structure hiérarchique<br/>
reflétant l'imbrication des balises HTML.<br/>
Chaque élément a un parent et peut avoir<br/>
des enfants.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste plate</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trop limité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas la structure adaptée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q09 : Réagir à un clic</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment exécuter une fonction <code>f</code> quand on<br/>
clique sur un bouton <code>btn</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>addEventListener</code> est la méthode standard.<br/>
Premier paramètre = type d'événement<br/>
(<code>"click"</code>, <code>"input"</code>, <code>"submit"</code>...),<br/>
second = fonction à exécuter.</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.addEventListener("onclick", f)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le nom de l'événement est<br/>
<code>"click"</code>, sans le préfixe <code>on</code>. Aucun<br/>
événement nommé <code>"onclick"</code> n'existe : la<br/>
fonction n'est jamais appelée, et aucun<br/>
message d'erreur ne le signale.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>btn.addEventListener("click", f())</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>f()</code> <strong>appelle</strong> la fonction tout<br/>
de suite et transmet son résultat (souvent<br/>
<code>undefined</code>) à <code>addEventListener</code>. Il faut<br/>
passer la fonction elle-même, <code>f</code>, sans<br/>
parenthèses.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>btn.addEventListener("click", f)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : méthode moderne et<br/>
recommandée. Permet d'ajouter plusieurs<br/>
écouteurs sans s'écraser mutuellement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>btn.onclick("click", f)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>onclick</code> est une propriété à<br/>
laquelle on <strong>affecte</strong> une fonction<br/>
(<code>btn.onclick = f</code>), pas une méthode à<br/>
appeler avec le nom de l'événement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q10 : Trace simple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait ce code ?<br/>
<pre><code>let x = 5;
x = x + 3;
console.log(x);</code></pre></p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Attention au piège de l'addition vs<br/>
concaténation : <code>5 + "3"</code> = <code>"53"</code> en JS<br/>
(coercition de type). C'est une source<br/>
classique de bugs.</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>Erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : code valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Affiche <code>53</code> (concaténation)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 3 est un nombre, pas une chaîne,<br/>
donc addition arithmétique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Affiche <code>5</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on additionne 3.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Affiche <code>8</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : x devient 5 + 3 = 8, puis<br/>
on l'affiche.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q11 : querySelector</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie<br/>
<code>document.querySelector(".bouton")</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>querySelector(sel)</code> renvoie le premier<br/>
élément correspondant au sélecteur ;<br/>
<code>querySelectorAll(sel)</code> les renvoie tous.</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 bouton cliqué le plus récemment</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode <code>querySelector</code><br/>
interroge la structure du<br/>
document, pas son historique<br/>
d'interaction : elle ne sait<br/>
pas quel bouton a été cliqué.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une chaîne contenant le HTML du bouton</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : renvoie l'objet DOM, pas une<br/>
chaîne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le premier élément de classe « bouton »</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>querySelector</code> accepte<br/>
un sélecteur CSS (classe, id,<br/>
combinaisons...) et renvoie le premier<br/>
élément correspondant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tous les éléments ayant la classe « bouton »</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est <code>querySelectorAll</code> qui<br/>
renvoie tous les éléments.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q12 : textContent vs innerHTML</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence entre <code>textContent</code> et<br/>
<code>innerHTML</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Si le contenu vient de l'utilisateur, on<br/>
préfère <code>textContent</code> : une balise tapée<br/>
dans un champ s'affiche alors telle quelle<br/>
au lieu d'être interprétée par le<br/>
navigateur.</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, les deux propriétés sont interchangeables</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'une affiche les balises telles<br/>
quelles, l'autre les interprète.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>textContent</code> = texte brut, <code>innerHTML</code> = HTML</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>el.textContent =<br/>
"&lt;b&gt;x&lt;/b&gt;"</code> affiche littéralement<br/>
<code>&lt;b&gt;x&lt;/b&gt;</code> ; <code>el.innerHTML = "&lt;b&gt;x&lt;/b&gt;"</code><br/>
affiche <code>x</code> en gras.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La propriété <code>textContent</code> n'existe pas en JavaScript</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est une propriété standard du<br/>
DOM, disponible sur tout élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>innerHTML</code> est systématiquement plus rapide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la vitesse n'est pas ce qui<br/>
distingue les deux propriétés ;<br/>
<code>innerHTML</code> interprète les balises,<br/>
<code>textContent</code> non.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q13 : Conditions</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle syntaxe est <strong>valide</strong> en JavaScript pour<br/>
une condition ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Syntaxe similaire à C/Java. Astuce : les<br/>
points-virgules sont techniquement<br/>
facultatifs (insertion automatique), mais<br/>
recommandés pour éviter les pièges.</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[<pre><code>if (x &gt; 0) {
    console.log("positif");
}</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : parenthèses autour de la<br/>
condition, accolades pour le bloc, points-<br/>
virgules en fin d'instruction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>if x &gt; 0 {
    console.log("positif");
}</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Parenthèses du <code>if</code> oubliées : en<br/>
JavaScript, la condition doit être<br/>
entre parenthèses, <code>if (x &gt; 0)</code>. Sans<br/>
elles, SyntaxError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>if x &gt; 0:
    console.log("positif")</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Réflexe Python : deux-points et bloc<br/>
indenté. En JavaScript, la condition va<br/>
entre parenthèses et le bloc entre<br/>
accolades.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>if (x &gt; 0):
    console.log("positif");</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Deux-points en trop : malgré les<br/>
parenthèses correctes, le <code>:</code> après la<br/>
condition n'existe pas en JavaScript<br/>
(SyntaxError). Le bloc s'écrit entre<br/>
accolades.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q14 : Boucle for</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle syntaxe <code>for</code> JavaScript itère <strong>5 fois</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La même boucle s'écrit en Python<br/>
<code>for i in range(5):</code>. Les deux langages<br/>
répètent cinq fois le corps, mais JavaScript<br/>
écrit explicitement l'initialisation, la<br/>
condition et l'incrément.</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>for (let i = 0; i &lt;= 5; i++) { ... }</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur de borne : avec <code>&lt;=</code>, la variable<br/>
i prend les valeurs 0, 1, 2, 3, 4 et 5,<br/>
soit <strong>six</strong> itérations. Piège classique<br/>
du « un de trop ».</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>for (let i = 0, i &lt; 5, i++) { ... }</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les trois parties du <code>for</code> sont<br/>
séparées par des points-virgules, pas<br/>
par des virgules. Ici, SyntaxError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>for (let i = 0; i &gt; 5; i++) { ... }</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la condition <code>i &gt; 5</code> est fausse<br/>
dès le départ (i vaut 0), donc le corps<br/>
de la boucle ne s'exécute jamais (zéro<br/>
itération, pas cinq).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>for (let i = 0; i &lt; 5; i++) { ... }</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : trois parties dans le<br/>
<code>for</code> : initialisation, condition,<br/>
incrément (séparées par <code>;</code>).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q15 : Définir une fonction</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la syntaxe valide d'une fonction JS ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Comparaison avec Python : <code>def carre(x):</code><br/>
suivi du bloc indenté <code>return x * x</code>. Les<br/>
deux langages utilisent <code>return</code>, mais<br/>
JavaScript délimite le bloc par des<br/>
accolades et Python par l'indentation.</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>carre(x) { return x * x; }</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Mot-clé <code>function</code> oublié : sans lui, ce<br/>
code est une SyntaxError (le <code>return</code> se<br/>
retrouve hors de toute fonction).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>Function carre(x) { return x * x; }</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur de casse : le mot-clé s'écrit<br/>
<code>function</code>, tout en minuscules.<br/>
<code>Function</code> avec majuscule désigne un<br/>
constructeur, pas le mot-clé, d'où<br/>
SyntaxError ici.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def carre(x) { return x * x; }</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>def</code> est le mot-clé de Python.<br/>
En JavaScript, une fonction se déclare<br/>
avec <code>function</code> ; ici, SyntaxError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>function carre(x) { return x * x; }</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : mot-clé <code>function</code>,<br/>
accolades pour le bloc, <code>return</code> pour la<br/>
valeur.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q16 : Modifier un attribut</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment changer l'<strong>attribut <code>src</code></strong> d'une image ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour les attributs standards (<code>src</code>, <code>href</code>,<br/>
<code>alt</code>, <code>id</code>...), on accède directement par<br/>
la propriété. Pour les attributs<br/>
personnalisés ou spéciaux : <code>setAttribute</code>/<br/>
<code>getAttribute</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>img.attribute("src", "...")</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : méthode inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>img.changeSrc("...")</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : méthode inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>img.src = "nouvelle.jpg"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on peut accéder aux<br/>
attributs comme à des propriétés JS.<br/>
Forme alternative :<br/>
<code>img.setAttribute("src", "nouvelle.jpg")</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>img.attr.src = "..."</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>.attr</code> n'existe pas.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q17 : Créer un élément</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment créer dynamiquement un nouveau<br/>
paragraphe <code>&lt;p&gt;</code> et l'<strong>ajouter</strong> au <code>&lt;body&gt;</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variantes pour ajouter : <code>appendChild</code> (à la<br/>
fin), <code>prepend</code> (au début), <code>insertBefore</code><br/>
(à un endroit précis).</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>const p = document.createElement("p");
p.textContent = "Hello";</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'élément est créé mais jamais<br/>
inséré dans le document. Sans<br/>
<code>document.body.appendChild(p)</code>, rien ne<br/>
s'affiche.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>const p = document.createElement("p");
p.textContent = "Hello";
document.body.appendChild("p");</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>appendChild</code> attend un <strong>nœud</strong>,<br/>
pas une chaîne : <code>"p"</code> provoque une<br/>
<code>TypeError</code>. Il faut lui passer l'élément<br/>
créé, <code>p</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>const p = "&lt;p&gt;Hello&lt;/p&gt;";
document.body.innerHTML = p;</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : affecter <code>innerHTML</code> <strong>remplace</strong><br/>
tout le contenu de <code>&lt;body&gt;</code> par ce fragment.<br/>
On n'ajoute pas, on écrase (et injecter du<br/>
HTML brut est risqué).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>const p = document.createElement("p");
p.textContent = "Hello";
document.body.appendChild(p);</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : trois étapes, à savoir<br/>
créer, remplir, ajouter au DOM.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q18 : Réagir à chaque caractère tapé</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une page contient le champ <code>&lt;input id="pseudo"&gt;</code>. On veut que la<br/>
fonction <code>verifier</code> s'exécute à chaque caractère tapé dans ce<br/>
champ, sans attendre aucun clic :</p>
<pre><code>document.getElementById("pseudo").addEventListener(???, verifier);</code></pre>
<p>Quel nom d'événement faut-il écrire à la place de <code>???</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un même composant peut réagir à plusieurs<br/>
événements : <code>click</code> pour un clic,<br/>
<code>mouseover</code> pour un survol, <code>input</code> pour une<br/>
modification du contenu d'un champ, <code>submit</code><br/>
pour l'envoi d'un formulaire. Choisir<br/>
l'événement, c'est choisir le moment où la<br/>
fonction s'exécute.</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>"click"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>click</code> ne se déclenche que<br/>
lorsqu'on clique sur le champ. Taper des<br/>
caractères ensuite ne rappelle pas la<br/>
fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>"input"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'événement <code>input</code> se<br/>
déclenche à chaque modification du<br/>
contenu du champ, donc à chaque caractère<br/>
tapé ou effacé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>"mouseover"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>mouseover</code> se déclenche quand<br/>
le pointeur de la souris passe au-dessus<br/>
du champ, que l'utilisateur tape ou non.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>"submit"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>submit</code> concerne un formulaire<br/>
entier, au moment de son envoi. Il ne se<br/>
produit pas à chaque caractère tapé.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q19 : Tableau JavaScript</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la notation <strong>littérale</strong> recommandée<br/>
pour déclarer un tableau de trois éléments en JS ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Tableaux JS : indexés à partir de 0,<br/>
hétérogènes (peuvent contenir n'importe quel<br/>
type). Très polyvalents.</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>let t = [1, 2, 3];</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : crochets, virgules.<br/>
Accès : <code>t[0]</code> (= 1). Méthodes :<br/>
<code>t.push</code>, <code>t.pop</code>, <code>t.length</code>...</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>Array(1, 2, 3)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Forme valide mais on préfère la<br/>
notation littérale <code>[1, 2, 3]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>let t = {1, 2, 3};</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>{}</code> désigne un objet en JS,<br/>
avec syntaxe <code>{cle: valeur}</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>let t = (1, 2, 3);</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce code est valide mais ne crée pas de<br/>
tableau : les parenthèses appliquent<br/>
l'<strong>opérateur virgule</strong>, qui évalue chaque<br/>
expression et ne garde que la dernière.<br/>
Ici <code>t</code> vaut le nombre <code>3</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q20 : Événement et données</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment savoir <strong>sur quel élément</strong> un<br/>
événement a eu lieu dans le gestionnaire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'objet <code>event</code> est passé automatiquement<br/>
au gestionnaire. Deux propriétés utiles :<br/>
<code>event.target</code> (l'élément qui a déclenché<br/>
l'événement) et <code>event.type</code> (le type<br/>
d'événement, par exemple <code>"click"</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>En relançant le code</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Relancer le script ne<br/>
fournit aucune information<br/>
supplémentaire. C'est l'objet<br/>
<code>event</code>, automatiquement<br/>
transmis au gestionnaire,<br/>
qui contient toutes les<br/>
données utiles.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Impossible</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il existe une variable<br/>
d'événement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec une simple variable globale partagée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une variable globale ne dit pas<br/>
d'elle-même quel élément a déclenché<br/>
l'événement ; il faudrait la mettre à jour<br/>
à la main, ce qui est fragile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec la propriété <code>event.target</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec<br/>
<code>function afficher(e) { console.log(e.target); }</code><br/>
puis <code>btn.addEventListener("click", afficher);</code>,<br/>
la console affiche l'élément qui a déclenché<br/>
l'événement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q21 : Débogage</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour déboguer un script JavaScript dans le<br/>
navigateur, quel outil utiliser ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Astuce : <code>console.log(...)</code> affiche la valeur<br/>
d'une variable dans la console des outils<br/>
développeur, ce qui permet de suivre<br/>
l'exécution du script pas à pas.</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>Un environnement de développement comme Visual Studio</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>IDE pour développer, pas pour déboguer<br/>
dans le navigateur, là où le script<br/>
s'exécute.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un éditeur de texte comme Notepad</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un éditeur permet d'écrire le code, pas<br/>
de l'exécuter pas à pas ni d'inspecter<br/>
la page.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un simple script Python d'analyse</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Python est un langage<br/>
autonome, exécuté côté<br/>
serveur ou en local. Le<br/>
débogage d'un script<br/>
JavaScript se fait dans<br/>
le navigateur, là où le<br/>
code s'exécute réellement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les outils développeur du navigateur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : accessibles avec F12.<br/>
Chrome DevTools, Firefox DevTools, Safari<br/>
Web Inspector. Tous gratuits et puissants.<br/>
Apprendre à les utiliser est essentiel.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q22 : DOM pas encore prêt</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Mon script, placé dans <code>&lt;head&gt;</code>,<br/>
fait <code>document.getElementById("menu")</code> mais<br/>
obtient <code>null</code>. L'élément <code>id="menu"</code> existe<br/>
bien plus bas dans le <code>&lt;body&gt;</code>, sans faute de<br/>
frappe. Pourquoi ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le navigateur construit la page au fur et à<br/>
mesure de sa lecture : un script ne peut<br/>
atteindre que les éléments déjà lus. Placer<br/>
le <code>&lt;script&gt;</code> juste avant <code>&lt;/body&gt;</code> garantit<br/>
que tous les éléments existent.</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>L'élément n'existe pas dans la page</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'énoncé précise que l'élément<br/>
existe et que l'<code>id</code> est correct. La<br/>
cause est le moment d'exécution.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>JavaScript ne peut pas lire le DOM</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est exactement son rôle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le script s'exécute avant la lecture du <code>&lt;body&gt;</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le navigateur lit la page de<br/>
haut en bas et exécute le script dès qu'il le<br/>
rencontre dans <code>&lt;head&gt;</code>. À ce moment,<br/>
l'élément <code>menu</code>, placé plus bas, n'existe pas<br/>
encore. Il suffit de placer le <code>&lt;script&gt;</code> à la<br/>
fin du <code>&lt;body&gt;</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le navigateur est buggé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tous les navigateurs se comportent<br/>
ainsi ; la cause est l'ordre de lecture de la<br/>
page.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q23 : Un score remis à zéro</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une page associe au bouton <code>&lt;button id="jouer"&gt;</code> la fonction<br/>
suivante, qui écrit dans l'élément <code>score</code> :<br/>
<pre><code>let n = 0;
function clic() {
  n = n + 2;
  if (n &gt; 4) {
    n = 0;
  }
  document.getElementById("score").textContent = n;
}
document.getElementById("jouer").addEventListener("click", clic);</code></pre><br/>
Qu'affiche l'élément <code>score</code> après <strong>cinq</strong> clics sur le bouton ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour analyser une fonction exécutée lors<br/>
d'un clic, on déroule chaque appel en notant<br/>
la valeur des variables. Une variable<br/>
déclarée en dehors de la fonction garde sa<br/>
valeur entre deux clics, ce qui permet de<br/>
construire un compteur.</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>10</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce total ignore le <code>if</code>. Au<br/>
troisième clic, <code>n</code> passe à 6, dépasse 4<br/>
et revient à 0 ; l'affichage ne dépasse<br/>
donc jamais 4.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>0</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la remise à zéro n'est pas<br/>
définitive. Après le troisième clic, <code>n</code><br/>
vaut 0, puis les clics suivants l'augmentent à nouveau de 2.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>2</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un clic manque dans le décompte.<br/>
Les valeurs affichées sont successivement<br/>
2, 4, 0, 2 puis 4.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>4</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les cinq clics affichent<br/>
successivement 2, 4, 0, 2, 4 (la remise à zéro survient dès que<br/>
<code>n</code> dépasse 4). La variable <code>n</code>, déclarée hors de<br/>
la fonction, garde sa valeur d'un clic à<br/>
l'autre.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q24 : Une vérification refaite par le serveur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Sur un site d'inscription, une fonction JavaScript vérifie que<br/>
le mot de passe choisi compte au moins 8 caractères et bloque<br/>
l'envoi du formulaire sinon. Le développeur fait pourtant refaire<br/>
la même vérification par le programme du serveur. Pourquoi ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une vérification en JavaScript rend service<br/>
à l'utilisateur, qui voit son erreur tout de<br/>
suite, sans attendre le serveur. Mais seule<br/>
une vérification exécutée sur le serveur<br/>
garantit les données qu'il enregistre.</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>Parce que JavaScript ne sait pas compter les caractères d'une chaîne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : JavaScript compte sans difficulté<br/>
les caractères d'une chaîne, avec<br/>
<code>length</code>. La raison tient à l'endroit où<br/>
le code s'exécute.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que le script s'exécute chez le client, qui peut le contourner</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le script est envoyé au<br/>
navigateur et s'exécute sur la machine de<br/>
l'utilisateur, qui peut le modifier ou<br/>
envoyer une requête sans passer par la<br/>
page. Seul le serveur maîtrise son propre<br/>
programme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que le serveur exécute le script de la page avant de l'envoyer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le serveur envoie le script au<br/>
navigateur sans l'exécuter ; c'est le<br/>
client qui l'exécute. La vérification du<br/>
serveur est un programme distinct.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que le formulaire est envoyé deux fois, une fois par vérification</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le formulaire n'est envoyé<br/>
qu'une fois. Le navigateur vérifie avant<br/>
l'envoi, puis le serveur vérifie à la<br/>
réception.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes sur JavaScript<br/>
et le DOM, laquelle est <strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour afficher un simple texte, on utilise<br/>
<code>textContent</code> ; <code>innerHTML</code> sert quand la<br/>
chaîne contient des balises à interpréter.</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>addEventListener</code> permet d'ajouter plusieurs gestionnaires d'événements à un élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : avantage majeur sur <code>onclick =</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>document.getElementById(id)</code> renvoie le premier élément ou <code>null</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : comportement standard.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>textContent</code> interprète les balises contenues dans la chaîne affectée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : <code>textContent</code><br/>
affiche la chaîne telle quelle, balises<br/>
comprises. C'est <code>innerHTML</code> qui interprète<br/>
les balises.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le DOM est une représentation arborescente de la page HTML</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : structure clé du Web.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q26 : Ce qui décide de la réaction d'un bouton</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une page contient :</p>
<pre><code>&lt;button id="valider"&gt;Envoyer&lt;/button&gt;
&lt;p id="message"&gt;&lt;/p&gt;
&lt;script src="page.js"&gt;&lt;/script&gt;</code></pre>
<p>et le fichier <code>page.js</code> contient :</p>
<pre><code>function valider() {
  document.getElementById("message").textContent = "Merci !";
}
document.getElementById("valider").addEventListener("click", valider);</code></pre>
<p>Qu'est-ce qui décide de ce qui se passe au clic sur le bouton ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Il faut distinguer la description d'un<br/>
composant graphique, écrite en HTML, de son<br/>
comportement, programmé en JavaScript.<br/>
Modifier ce qui se passe au clic revient à<br/>
modifier la fonction associée à l'événement,<br/>
sans toucher au HTML.</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 texte <code>Envoyer</code> écrit entre les balises du bouton</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce texte décrit seulement ce<br/>
qu'affiche le bouton. Le remplacer par<br/>
<code>OK</code> ne changerait rien à la réaction au<br/>
clic.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La fonction du fichier <code>page.js</code> associée à l'événement <code>click</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le HTML décrit le<br/>
composant, un bouton d'identifiant<br/>
<code>valider</code> ; le JavaScript programme son<br/>
comportement en associant la fonction<br/>
<code>valider</code> à l'événement <code>click</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'attribut <code>id="valider"</code>, qui lance la fonction du même nom</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'identifiant sert seulement à<br/>
retrouver le bouton depuis le script. La<br/>
fonction pourrait porter un autre nom :<br/>
c'est <code>addEventListener</code> qui la relie au<br/>
clic.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La balise <code>&lt;button&gt;</code>, qui envoie la page au serveur à chaque clic</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : hors d'un formulaire, un bouton<br/>
n'envoie rien au serveur. Sans le script,<br/>
un clic sur ce bouton ne produirait aucun<br/>
effet.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q27 : Modifier les classes d'un élément</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour ajouter la classe <code>actif</code> à un élément <code>el</code><br/>
sélectionné via <code>querySelector</code>, quelle instruction<br/>
utiliser en JavaScript moderne ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Avantages de <code>classList</code> : on n'écrase pas les<br/>
autres classes, le code est lisible, et<br/>
<code>toggle("actif")</code> est un raccourci pratique pour<br/>
ajouter ou retirer la classe selon son état<br/>
courant. C'est l'API à privilégier pour basculer<br/>
entre des états visuels.</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>el.style.actif = true</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la propriété <code>style</code> permet de<br/>
modifier les styles <strong>inline</strong>, pas la liste<br/>
des classes. Il n'existe pas de style<br/>
<code>actif</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>el.addClass("actif")</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>addClass</code> n'est pas une méthode<br/>
des éléments de la page ; cette ligne lève<br/>
une erreur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>el.classList.add("actif")</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la propriété <code>classList</code><br/>
fournit une API dédiée à la gestion des<br/>
classes : <code>add</code>, <code>remove</code>, <code>toggle</code>,<br/>
<code>contains</code>. C'est la méthode recommandée<br/>
aujourd'hui.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>el.class = "actif"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la propriété DOM s'appelle<br/>
<code>className</code>, pas <code>class</code> (qui est un mot<br/>
réservé en JavaScript). Et l'assigner écrase<br/>
toutes les classes existantes au lieu d'en<br/>
ajouter une.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q28 : getElementById vs querySelector</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour un même identifiant présent dans la page, que<br/>
renvoient les deux appels <code>document.getElementById("titre")</code><br/>
et <code>document.querySelector("#titre")</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique : utiliser <code>getElementById</code> quand<br/>
on cible précisément un identifiant ;<br/>
<code>querySelector</code> lorsqu'on a besoin d'un sélecteur<br/>
complexe (par exemple <code>nav &gt; a.actif:first-child</code>).<br/>
Pour récupérer plusieurs éléments,<br/>
<code>querySelectorAll</code> renvoie une <code>NodeList</code><br/>
itérable.</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 liste d'éléments pour le premier, un seul élément pour le second</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>getElementById</code> renvoie un seul<br/>
élément (ou <code>null</code>). C'est <code>getElementsByClassName</code><br/>
ou <code>querySelectorAll</code> qui renvoient une<br/>
collection.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>null</code> pour le second, car <code>querySelector</code> attend le nom <code>titre</code> sans dièse</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>querySelector</code> attend un<br/>
sélecteur CSS, et le dièse y désigne<br/>
justement un identifiant. Sans dièse,<br/>
<code>titre</code> viserait une balise <code>&lt;titre&gt;</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le même élément, dans les deux cas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour un identifiant donné, les<br/>
deux méthodes renvoient le même élément.<br/>
<code>getElementById</code> est plus rapide et plus<br/>
ancienne ; <code>querySelector</code> accepte tout<br/>
sélecteur CSS, ce qui la rend plus polyvalente<br/>
mais légèrement plus lente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un élément pour le second seulement, le premier ne ciblant que les classes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>getElementById</code> cible bien un<br/>
identifiant (pas une classe), et renvoie donc<br/>
ici l'élément. <code>querySelector</code>, lui, accepte<br/>
tout sélecteur CSS, dont les classes<br/>
(<code>.maClasse</code>).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q29 : Le même programme en Python et en JavaScript</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Voici deux programmes.</p>
<pre><code>total = 0
for i in range(1, 4):
    total = total + i
print(total)</code></pre>
<pre><code>let total = 0;
for (let i = 1; i &lt; 4; i++) {
    total = total + i;
}
console.log(total);</code></pre>
<p>Que peut-on dire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Affectation, boucle bornée, accumulateur, affichage :<br/>
les constructions élémentaires sont les mêmes d'un<br/>
langage à l'autre. Ce qui change est la syntaxe :<br/>
accolades et point-virgule en JavaScript,<br/>
indentation et <code>range</code> en Python.</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>Ils affichent tous deux <code>6</code> : mêmes constructions, seule la syntaxe diffère</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les deux boucles font prendre à <code>i</code> les valeurs<br/>
$1$, $2$ et $3$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le programme JavaScript affiche <code>10</code>, car la condition <code>i &lt; 4</code> fait entrer la valeur $4$ dans la boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>i &lt; 4</code> est strict : la boucle s'arrête avant<br/>
$4$, exactement comme <code>range(1, 4)</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le programme Python affiche <code>10</code>, car <code>range(1, 4)</code> parcourt les entiers de $1$ à $4$ inclus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>range(1, 4)</code> s'arrête avant $4$ ; la somme est<br/>
$1 + 2 + 3 = 6$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Seul le programme Python contient une vraie boucle ; JavaScript répète simplement l'addition trois fois</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>for (let i = 1; i &lt; 4; i++)</code> est bien une<br/>
boucle ; elle s'écrit avec une initialisation,<br/>
une condition et un pas.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q30 : Un trait particulier de JavaScript</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi ces affirmations, laquelle décrit un trait de<br/>
JavaScript qui le distingue de Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les deux langages partagent variables, conditions,<br/>
boucles et fonctions. JavaScript se distingue par sa<br/>
syntaxe (accolades, points-virgules, <code>let</code>,<br/>
<code>function</code>) et par son terrain d'emploi, le<br/>
navigateur.</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>Les blocs d'instructions sont délimités par des accolades, et non par l'indentation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>En JavaScript, l'indentation est libre ; ce sont<br/>
<code>{</code> et <code>}</code> qui marquent le début et la fin d'un<br/>
bloc.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les variables doivent être déclarées avec leur type, par exemple <code>int x</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>JavaScript déclare avec <code>let</code> ou <code>const</code>, sans<br/>
type ; c'est en C ou en Java qu'on écrit <code>int x</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction JavaScript ne peut pas renvoyer de valeur au programme qui l'appelle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>return</code> existe et joue le même rôle qu'en<br/>
Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>JavaScript ne possède pas de boucle <code>while</code>, seulement des boucles <code>for</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>while</code> existe en JavaScript avec la même logique<br/>
qu'en Python.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q31 : Traduire une division entière</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>En Python, <code>n // 2</code> donne le quotient entier de <code>n</code><br/>
par $2$. Un élève traduit en JavaScript :</p>
<pre><code>let n = 7;
let q = n // 2;
console.log(q);</code></pre>
<p>Qu'affiche ce programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un même symbole peut changer de sens d'un langage à<br/>
l'autre : <code>//</code> est la division entière en Python et<br/>
un commentaire en JavaScript. La traduction correcte<br/>
est <code>let q = Math.floor(n / 2);</code>, qui affiche <code>3</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="100" format="html">
    <text><![CDATA[<p><code>7</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>En JavaScript, <code>//</code> commence un commentaire : la<br/>
ligne se lit <code>let q = n;</code> et <code>q</code> vaut $7$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>3</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce serait le résultat voulu, obtenu avec<br/>
<code>Math.floor(n / 2)</code> ; <code>//</code> n'est pas un opérateur<br/>
en JavaScript.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>3.5</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>n / 2</code> donnerait $3{,}5$, mais ici la division<br/>
n'est jamais exécutée : tout ce qui suit <code>//</code> est<br/>
ignoré.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur de syntaxe, car <code>//</code> n'existe pas en JavaScript</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>//</code> existe, mais comme marque de commentaire ; le<br/>
programme est valide et s'exécute.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q32 : La fonction passée au gestionnaire</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle écriture déclenche la fonction <code>saluer</code> à chaque clic sur le<br/>
bouton <code>btn</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un gestionnaire est une fonction donnée en argument, pas appelée :<br/>
c'est l'événement qui l'appellera plus tard.</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>btn.addEventListener("click", saluer);</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on transmet la fonction elle-même, sans<br/>
parenthèses. Le navigateur l'appellera à chaque clic.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>btn.addEventListener("click", saluer());</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec les parenthèses, <code>saluer</code> est appelée une seule<br/>
fois, tout de suite, et c'est son résultat qui est transmis.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>btn.addEventListener(saluer, "click");</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'ordre des arguments est inversé ; le nom de<br/>
l'événement vient en premier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>btn.click = saluer();</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette affectation appelle <code>saluer</code> immédiatement et ne<br/>
crée aucun gestionnaire.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q33 : Deux gestionnaires pour un même clic</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un bouton reçoit <code>addEventListener("click", a)</code> puis<br/>
<code>addEventListener("click", b)</code>. Que se passe-t-il lors d'un clic ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>addEventListener</code> empile les gestionnaires ; pour en retirer un, on<br/>
utilise <code>removeEventListener</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="100" format="html">
    <text><![CDATA[<p><code>a</code> puis <code>b</code> sont appelées, dans l'ordre d'enregistrement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>addEventListener</code> ajoute un gestionnaire sans<br/>
remplacer les précédents. Tous sont appelés, dans l'ordre où ils<br/>
ont été attachés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Seule <code>b</code> est appelée, le second enregistrement remplaçant le premier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le remplacement serait le comportement d'une affectation<br/>
<code>onclick</code>, pas d'<code>addEventListener</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Seule <code>a</code> est appelée, le second enregistrement étant refusé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : rien n'est refusé ; plusieurs gestionnaires peuvent<br/>
coexister.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur, un événement n'acceptant qu'un seul gestionnaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est précisément l'intérêt d'<code>addEventListener</code> que<br/>
d'en accepter plusieurs.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q34 : Gestionnaire dans le HTML ou dans le script</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><code>&lt;button onclick="valider()"&gt;</code> et<br/>
<code>btn.addEventListener("click", valider)</code> déclenchent tous deux<br/>
<code>valider</code> au clic. Pourquoi préfère-t-on la seconde écriture ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>HTML pour le contenu, CSS pour la forme, JavaScript pour le<br/>
comportement : attacher les gestionnaires dans le script respecte<br/>
cette séparation.</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>Elle sépare le script du HTML et accepte plusieurs gestionnaires</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le HTML reste purement descriptif, le script<br/>
regroupe toute la logique, et plusieurs fonctions peuvent écouter<br/>
le même événement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle est la seule qui fonctionne dans les navigateurs récents</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'attribut <code>onclick</code> fonctionne toujours ; la question<br/>
est d'organisation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle rend le bouton plus rapide à réagir au clic</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les deux écritures réagissent aussi vite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle évite d'avoir à définir la fonction <code>valider</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : dans les deux cas, la fonction doit exister.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q35 : Changer une couleur depuis JavaScript</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait l'instruction<br/>
<code>document.getElementById("titre").style.color = "red";</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Modifier <code>element.style</code> revient à ajouter un style en ligne ;<br/>
changer une classe est souvent préférable pour garder le CSS<br/>
centralisé.</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>Elle colore en rouge le texte de l'élément d'<code>id</code> <code>titre</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la propriété <code>style</code> d'un élément donne accès à<br/>
ses propriétés CSS, modifiables depuis le script.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle colore en rouge tous les titres de la page</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>getElementById</code> ne renvoie que l'élément portant cet<br/>
<code>id</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle ajoute la classe <code>red</code> à l'élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune classe n'est touchée ; la couleur est fixée<br/>
directement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle provoque une erreur, le style étant réservé au CSS</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : JavaScript peut lire et écrire les styles d'un élément.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q36 : Modifier tous les éléments d'une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Sami veut mettre en rouge tous les <code>li</code> de la page. Pourquoi<br/>
<code>document.querySelector("li").style.color = "red";</code> ne suffit-il<br/>
pas ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>querySelector</code> donne un élément, <code>querySelectorAll</code> une collection<br/>
à parcourir : la différence se voit dès qu'on veut agir sur<br/>
plusieurs éléments.</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>Parce que <code>querySelector</code> ne renvoie que le premier <code>li</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>querySelectorAll("li")</code> renvoie tous les<br/>
éléments correspondants ; une boucle applique ensuite le style à<br/>
chacun.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les <code>li</code> ne peuvent pas être colorés depuis JavaScript</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tout élément peut recevoir un style depuis le script.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que <code>style.color</code> n'accepte pas la valeur <code>red</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>red</code> est une valeur de couleur valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que <code>querySelector</code> ne fonctionne qu'avec des <code>id</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>querySelector</code> accepte tout sélecteur CSS, ici le nom<br/>
d'une balise.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
