<?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). JavaScript a aussi un<br/>
pendant côté serveur (Node.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="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 : interactions, animations, modification du contenu en réaction à l'utilisateur</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 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>Variantes : script externe (<code>src</code>), script<br/>
inline (<code>&lt;script&gt;...&lt;/script&gt;</code>), module<br/>
(<code>type="module"</code>). Toujours préférer le<br/>
script externe pour la maintenance.</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/>
<code>src</code>. Préférable de placer en bas du<br/>
<code>&lt;body&gt;</code> (ou avec <code>defer</code> dans <code>&lt;head&gt;</code>)<br/>
pour ne pas bloquer le rendu.</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>Trois mots-clés : <code>var</code> (ancien, à éviter),<br/>
<code>let</code> (modifiable), <code>const</code> (constante,<br/>
non réassignable). Privilégier <code>const</code> par<br/>
défaut, <code>let</code> quand on doit modifier.</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>Possible mais désuet (portée<br/>
déroutante). Préférer <code>let</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>def</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est Python.</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 de portée bloc, modifiable.<br/>
Standard depuis ES6 (2015).</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>echo "Hello"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est PHP/Bash.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>print("Hello")</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>puts "Hello"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est Ruby.</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 : pas en JavaScript natif (oui en<br/>
jQuery).</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> (texte pur) vs <code>innerHTML</code><br/>
(HTML brut). Préférer <code>textContent</code> quand on<br/>
affiche du contenu utilisateur (sécurité).</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), utiliser <code>innerHTML</code><br/>
(mais attention aux failles XSS).</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 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.onClick = f</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Casse incorrecte. C'est <code>onclick</code> (tout<br/>
en minuscules).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>btn.click = f</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>.click</code> est une méthode (pour<br/>
déclencher le clic), pas un setter de<br/>
handler.</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.listen(f)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : méthode inexistante en JS natif.</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> = premier élément ;<br/>
<code>querySelectorAll(sel)</code> = NodeList. Plus<br/>
flexibles que <code>getElementById</code> /<br/>
<code>getElementsByClassName</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>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. Le suivi de<br/>
l'élément actif passe par<br/>
<code>document.activeElement</code> ou<br/>
des gestionnaires d'évènements.</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 ayant la classe « bouton » (ou <code>null</code> si aucun)</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>Sécurité : si le contenu vient de<br/>
l'utilisateur, <strong>toujours</strong> utiliser<br/>
<code>textContent</code> pour éviter les attaques XSS<br/>
(injection de scripts).</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</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : différence importante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>textContent</code> traite la valeur comme du texte brut (échappant les balises) ; <code>innerHTML</code> interprète le 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><code>textContent</code> n'existe pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : méthode standard.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>innerHTML</code> est plus rapide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tendance inverse, et la sécurité<br/>
prime.</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 then
    console.log("positif")
end</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la syntaxe Lua/Ruby.</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>Erreur : c'est la syntaxe Python.</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>Erreur : syntaxe inventée.</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>Variantes modernes : <code>for...of</code> (itérer sur<br/>
les valeurs d'un tableau), <code>for...in</code><br/>
(itérer sur les clés d'un objet),<br/>
<code>forEach</code> (méthode des tableaux).</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 i in range(5)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>for i = 0 to 5</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est BASIC/Pascal.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>loop 5 times</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : syntaxe inventée.</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>Syntaxe moderne (« arrow function ») :<br/>
<code>const carre = x =&gt; x * x;</code>. Plus concise<br/>
mais subtilités sur <code>this</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[<pre><code>def carre(x): return x * x</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>method carre(x) { ... }</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de mot-clé <code>method</code> global<br/>
en JS.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>carre(x) -&gt; x * x</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : syntaxe inventée.</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>add("p", "Hello");</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : fonction inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>new HTMLElement("p");</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas la bonne API.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>document.body.innerHTML = "&lt;p&gt;Hello&lt;/p&gt;";</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cela écrase <strong>tout</strong> le contenu de<br/>
<code>&lt;body&gt;</code>. Pas équivalent (et peu sûr).</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 : == vs ===</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence entre <code>==</code> et <code>===</code> en<br/>
JavaScript ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle d'or : <strong>toujours utiliser <code>===</code></strong> sauf<br/>
cas très précis. Idem pour l'inégalité :<br/>
<code>!==</code> plutôt que <code>!=</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>Aucune</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : différence importante !</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>==</code> compare avec conversion de type (<code>5 == "5"</code> est <code>true</code>) ; <code>===</code> compare strictement (sans conversion : <code>5 === "5"</code> est <code>false</code>)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : préférer <code>===</code> pour<br/>
éviter les surprises de coercition.<br/>
Source de bugs subtils en JS.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>==</code> n'existe pas en JS moderne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il existe, mais à éviter.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>===</code> est obsolète</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la version recommandée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q19 : Tableau JavaScript</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment déclarer un <strong>tableau</strong> de trois<br/>
é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>Erreur : ce serait un tuple Python.</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 callback. Propriétés utiles :<br/>
<code>event.target</code> (qui a déclenché),<br/>
<code>event.type</code> (type d'événement),<br/>
<code>event.preventDefault()</code> (annuler le<br/>
comportement par défaut).</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 variable globale</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pratique fragile, à éviter.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Via <code>event.target</code> (passé au callback)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse :<br/>
<code>btn.addEventListener("click", (e) =&gt;<br/>
console.log(e.target));</code> affiche<br/>
l'élément qui a déclenché 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>Astuces : <code>debugger;</code> pour mettre un point<br/>
d'arrêt en code ; <code>console.table(arr)</code> pour<br/>
visualiser un tableau ; <code>console.dir(elem)</code><br/>
pour explorer un nœud 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="0" format="html">
    <text><![CDATA[<p>Visual Studio</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>IDE pour développer, pas pour déboguer<br/>
dans le navigateur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Notepad</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas un débogueur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un script Python</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 (touche F12) : console, débogueur, inspecteur, onglet Network</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Chrome DevTools, Firefox<br/>
DevTools, Safari Web Inspector. Tous<br/>
gratuits et puissants. Apprendre à les<br/>
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 JS fait <code>document.getElementById</code><br/>
mais renvoie <code>null</code>. Pourquoi ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trois solutions : (1) placer le <code>&lt;script&gt;</code> à<br/>
la fin de <code>&lt;body&gt;</code>, (2) <code>&lt;script defer&gt;</code><br/>
dans <code>&lt;head&gt;</code>, (3) <code>document.addEventListener<br/>
("DOMContentLoaded", ...)</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>L'élément n'existe pas dans la page</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Possible aussi, mais la cause la plus<br/>
fréquente est le timing.</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 que le DOM ait été parsé. L'élément n'existe pas encore.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si <code>&lt;script&gt;</code> est dans<br/>
<code>&lt;head&gt;</code> sans <code>defer</code>, il s'exécute avant<br/>
le <code>&lt;body&gt;</code>. Solutions : placer le<br/>
script en bas du <code>&lt;body&gt;</code>, utiliser<br/>
<code>defer</code>, ou encapsuler dans un<br/>
écouteur <code>DOMContentLoaded</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>Très improbable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q23 : Coercition de type</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie <code>"5" + 3</code> en JavaScript ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Comparaison : <code>"5" - 3</code> = <code>2</code> (le <code>-</code> force<br/>
la conversion en nombre). Imprévisible :<br/>
toujours convertir explicitement avec<br/>
<code>Number(s)</code> ou <code>parseInt(s)</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>"53" (chaîne, par concaténation)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec <code>+</code>, si l'un des<br/>
opérandes est une chaîne, l'autre est<br/>
converti en chaîne et on concatène.<br/>
Comportement spécifique à JS, source<br/>
fréquente de bugs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Erreur de type</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : JS coercite silencieusement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 5 ignorerait le 3.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>8</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas d'addition arithmétique car<br/>
un opérande est une chaîne.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>JavaScript et DOM — Q24 : Sécurité innerHTML</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi <code>el.innerHTML = userInput;</code> est-il<br/>
<strong>dangereux</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle d'or : ne jamais insérer de contenu<br/>
utilisateur via <code>innerHTML</code>. Préférer<br/>
<code>textContent</code>, ou un nettoyage avec une<br/>
bibliothèque (DOMPurify).</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 c'est lent</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas d'impact significatif sur la<br/>
performance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce qu'un utilisateur malveillant peut injecter du code HTML/JS (attaque XSS : Cross-Site Scripting)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si <code>userInput</code> contient<br/>
<code>&lt;script&gt;...&lt;/script&gt;</code>, le code malveillant<br/>
s'exécute dans le navigateur. Solution :<br/>
utiliser <code>textContent</code> (qui échappe) ou<br/>
assainir l'entrée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que <code>innerHTML</code> est obsolète</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas obsolète.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun risque réel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : XSS est l'une des<br/>
vulnérabilités les plus exploitées.</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>Mnémonique : « toujours triple égal » en<br/>
JS, sauf cas très exceptionnels documentés.</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>==</code> et <code>===</code> sont synonymes en JavaScript</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : <code>==</code> fait<br/>
une comparaison <strong>avec coercition</strong> (donc<br/>
parfois surprenante : <code>0 == false</code>,<br/>
<code>"" == 0</code>...) ; <code>===</code> est une<br/>
comparaison <strong>stricte</strong>, sans conversion<br/>
de type.</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 : let, const et var</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Lequel de ces mots-clés permet, en JavaScript<br/>
moderne, de déclarer une variable dont la valeur ne<br/>
pourra <strong>plus changer</strong> après l'affectation initiale ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Recommandation moderne : préférer <code>const</code> par<br/>
défaut, et n'utiliser <code>let</code> que si on a vraiment<br/>
besoin de réaffecter la variable. Le mot-clé <code>var</code><br/>
est conservé pour la rétrocompatibilité mais ne<br/>
doit plus apparaître dans du code récent.</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> autorise au contraire la<br/>
réaffectation. C'est l'ancien mot-clé de<br/>
déclaration, à éviter aujourd'hui car il a<br/>
également une portée moins prévisible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>function</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>function</code> sert à déclarer une<br/>
fonction, pas une variable. Il n'a aucun<br/>
rapport avec la modification d'une valeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>const</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>const</code> interdit la<br/>
réaffectation après l'initialisation. Cela<br/>
n'empêche cependant pas de <strong>muter</strong> un objet<br/>
ou un tableau (modifier ses propriétés ou ses<br/>
éléments).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>let</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>let</code> déclare une variable dont la<br/>
valeur peut être réaffectée. Pour interdire la<br/>
réaffectation, on utilise plutôt <code>const</code>.</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/>
native du DOM. C'est une fonction de jQuery,<br/>
librairie qui n'est pas disponible par défaut<br/>
dans le navigateur.</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>`el.class = "actif"</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>Quelle est la différence entre <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>La première renvoie une liste, la seconde un seul élément</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>querySelector</code> ne fonctionne que sur les pages chargées par AJAX</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>querySelector</code> fonctionne sur tout<br/>
élément du DOM, quel que soit son mode de<br/>
chargement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Aucune dans le résultat ; les deux retournent l'élément dont l'<code>id</code> vaut <code>titre</code> (s'il existe)</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>La première fonctionne sur les classes, la seconde sur les identifiants</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse. <code>getElementById</code><br/>
cible un identifiant ; <code>querySelector</code> accepte<br/>
tout sélecteur CSS, dont les classes<br/>
(<code>.maClasse</code>).</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
