<?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 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 script.js dans<br/>
une page HTML ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variantes : script externe (src), script<br/>
inline (&lt;script&gt;...&lt;/script&gt;), module<br/>
(type="module"). 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[<p>`<code>html<br/>
&lt;link href="script.js"&gt;<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : &lt;link&gt; est pour les feuilles<br/>
de style.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>html<br/>
&lt;script src="script.js"&gt;&lt;/script&gt;<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : balise &lt;script&gt; avec<br/>
src. Préférable de placer en bas du<br/>
&lt;body&gt; (ou avec defer dans &lt;head&gt;)<br/>
pour ne pas bloquer le rendu.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>html<br/>
&lt;import "script.js"&gt;<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : balise inexistante en HTML.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>html<br/>
&lt;js src="script.js"&gt;&lt;/js&gt;<br/>
</code>`</p>]]></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 : var (ancien, à éviter),<br/>
let (modifiable), const (constante,<br/>
non réassignable). Privilégier const par<br/>
défaut, let 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>var</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Possible mais désuet (portée<br/>
déroutante). Préférer let.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Let</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur de casse : les mots-clés<br/>
JavaScript s'écrivent tout en<br/>
minuscules. Let x = 5; provoque une<br/>
SyntaxError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>let</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : let x = 5; 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>int</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 : console.warn, console.error,<br/>
console.table (pour les objets/tableaux),<br/>
console.dir (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>console.log("Hello")</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : console.log 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>Console.log("Hello")</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur de casse : JavaScript distingue<br/>
majuscules et minuscules. L'objet<br/>
s'appelle console, tout en minuscules ;<br/>
Console n'est pas défini<br/>
(ReferenceError).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>console.log "Hello"</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>log("Hello")</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Préfixe oublié : log seul n'est pas<br/>
défini (ReferenceError). C'est une<br/>
méthode de l'objet console, il faut<br/>
donc écrire console.log.</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 W3C 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 W3C,<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/>
id="titre" ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Alternative moderne et flexible :<br/>
document.querySelector("#titre") (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>getElementById(titre)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il manque document. et les<br/>
guillemets autour de la chaîne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>document.find("#titre")</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>document.getId("titre")</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : méthode inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>document.getElementById("titre")</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : méthode classique. Renvoie<br/>
l'objet DOM correspondant ou null 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 el<br/>
sélectionné par DOM ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>textContent (texte pur) vs innerHTML<br/>
(HTML brut). Préférer textContent 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>el.value = "..."</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : value concerne les champs de<br/>
formulaire (&lt;input&gt;, &lt;select&gt;).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>el.text = "..."</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : propriété inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>el.textContent = "..."</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : textContent modifie le<br/>
contenu textuel. Pour insérer du HTML<br/>
(avec balises), utiliser innerHTML<br/>
(mais attention aux failles XSS).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>el.changeText("...")</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 &lt;html&gt;</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 f quand on<br/>
clique sur un bouton btn ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>addEventListener est la méthode standard.<br/>
Premier paramètre = type d'événement<br/>
("click", "input", "submit"...),<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>btn.addEventListener("onclick", f)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le nom de l'événement est<br/>
"click", sans le préfixe on. Aucun<br/>
événement nommé "onclick" 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>btn.addEventListener("click", f())</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : f() <strong>appelle</strong> la fonction tout<br/>
de suite et transmet son résultat (souvent<br/>
undefined) à addEventListener. Il faut<br/>
passer la fonction elle-même, f, sans<br/>
parenthèses.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>btn.addEventListener("click", f)</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>btn.onclick("click", f)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : onclick est une propriété à<br/>
laquelle on <strong>affecte</strong> une fonction<br/>
(btn.onclick = f), 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/>
`<code>javascript<br/>
let x = 5;<br/>
x = x + 3;<br/>
console.log(x);<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Attention au piège de l'addition vs<br/>
concaténation : 5 + "3" = "53" 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 53 (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 5</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 8</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/>
document.querySelector(".bouton") ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>querySelector(sel) = premier élément ;<br/>
querySelectorAll(sel) = NodeList. Plus<br/>
flexibles que getElementById /<br/>
getElementsByClassName.</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 querySelector<br/>
interroge la structure du<br/>
document, pas son historique<br/>
d'interaction. Le suivi de<br/>
l'élément actif passe par<br/>
document.activeElement 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 de classe « bouton »</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : querySelector 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 querySelectorAll 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 textContent et<br/>
innerHTML ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sécurité : si le contenu vient de<br/>
l'utilisateur, <strong>toujours</strong> utiliser<br/>
textContent 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, les deux propriétés sont interchangeables</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la différence est importante,<br/>
notamment pour la sécurité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>textContent = texte brut, innerHTML = HTML</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : el.textContent =<br/>
"&lt;b&gt;x&lt;/b&gt;" affiche littéralement<br/>
&lt;b&gt;x&lt;/b&gt; ; el.innerHTML = "&lt;b&gt;x&lt;/b&gt;"<br/>
affiche x en gras.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La propriété textContent 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>innerHTML est systématiquement 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[<p>`<code>javascript<br/>
if (x &gt; 0) {<br/>
    console.log("positif");<br/>
}<br/>
</code>`</p>]]></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[<p>`<code>javascript<br/>
if x &gt; 0 {<br/>
    console.log("positif");<br/>
}<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Parenthèses du if oubliées : en<br/>
JavaScript, la condition doit être<br/>
entre parenthèses, if (x &gt; 0). Sans<br/>
elles, SyntaxError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>javascript<br/>
if x &gt; 0:<br/>
    console.log("positif")<br/>
</code>`</p>]]></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[<p>`<code>javascript<br/>
if (x &gt; 0):<br/>
    console.log("positif");<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Deux-points en trop : malgré les<br/>
parenthèses correctes, le : 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 for JavaScript itère <strong>5 fois</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variantes modernes : for...of (itérer sur<br/>
les valeurs d'un tableau), for...in<br/>
(itérer sur les clés d'un objet),<br/>
forEach (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[<p>`<code>javascript<br/>
for (let i = 0; i &lt;= 5; i++) { ... }<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur de borne : avec &lt;=, 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[<p>`<code>javascript<br/>
for (let i = 0, i &lt; 5, i++) { ... }<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les trois parties du for 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[<p>`<code>javascript<br/>
for (let i = 0; i &gt; 5; i++) { ... }<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la condition i &gt; 5 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[<p>`<code>javascript<br/>
for (let i = 0; i &lt; 5; i++) { ... }<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : trois parties dans le<br/>
for : initialisation, condition,<br/>
incrément (séparées par ;).</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/>
const carre = x =&gt; x * x;. Plus concise<br/>
mais subtilités sur this.</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>javascript<br/>
carre(x) { return x * x; }<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Mot-clé function oublié : sans lui, ce<br/>
code est une SyntaxError (le return se<br/>
retrouve hors de toute fonction).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>javascript<br/>
Function carre(x) { return x * x; }<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur de casse : le mot-clé s'écrit<br/>
function, tout en minuscules.<br/>
Function 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[<p>`<code>javascript<br/>
const carre = x -&gt; x * x;<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Mauvaise flèche : les fonctions fléchées<br/>
s'écrivent avec =&gt; et non -&gt;. Avec<br/>
-&gt;, SyntaxError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>javascript<br/>
function carre(x) { return x * x; }<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : mot-clé function,<br/>
accolades pour le bloc, return 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 src</strong> d'une image ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour les attributs standards (src, href,<br/>
alt, id...), on accède directement par<br/>
la propriété. Pour les attributs<br/>
personnalisés ou spéciaux : setAttribute/<br/>
getAttribute.</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>img.attribute("src", "...")</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : méthode inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>img.changeSrc("...")</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : méthode inexistante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>img.src = "nouvelle.jpg"</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/>
img.setAttribute("src", "nouvelle.jpg").</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>img.attr.src = "..."</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : .attr 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 &lt;p&gt; et l'<strong>ajouter</strong> au &lt;body&gt; ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variantes pour ajouter : appendChild (à la<br/>
fin), prepend (au début), insertBefore<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[<p>`<code>javascript<br/>
const p = document.createElement("p");<br/>
p.textContent = "Hello";<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'élément est créé mais jamais<br/>
inséré dans le document. Sans<br/>
document.body.appendChild(p), rien ne<br/>
s'affiche.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>javascript<br/>
const p = document.createElement("p");<br/>
p.textContent = "Hello";<br/>
document.body.appendChild("p");<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : appendChild attend un <strong>nœud</strong>,<br/>
pas une chaîne : "p" provoque une<br/>
TypeError. Il faut lui passer l'élément<br/>
créé, p.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>javascript<br/>
const p = "&lt;p&gt;Hello&lt;/p&gt;";<br/>
document.body.innerHTML = p;<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : affecter innerHTML <strong>remplace</strong><br/>
tout le contenu de &lt;body&gt; 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[<p>`<code>javascript<br/>
const p = document.createElement("p");<br/>
p.textContent = "Hello";<br/>
document.body.appendChild(p);<br/>
</code>`</p>]]></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 == et === en<br/>
JavaScript ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle d'or : <strong>toujours utiliser ===</strong> sauf<br/>
cas très précis. Idem pour l'inégalité :<br/>
!== plutôt que !=.</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>== convertit le type, === non</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : préférer === 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>== 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>=== est totalement 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>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>let t = [1, 2, 3];</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : crochets, virgules.<br/>
Accès : t[0] (= 1). Méthodes :<br/>
t.push, t.pop, t.length...</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Array(1, 2, 3)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Forme valide mais on préfère la<br/>
notation littérale [1, 2, 3].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>let t = {1, 2, 3};</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : {} désigne un objet en JS,<br/>
avec syntaxe {cle: valeur}.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>let t = (1, 2, 3);</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 t vaut le nombre 3.</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 event est passé automatiquement<br/>
au callback. Propriétés utiles :<br/>
event.target (qui a déclenché),<br/>
event.type (type d'événement),<br/>
event.preventDefault() (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/>
event, 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>Pratique fragile, à éviter.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Via event.target (passé au callback)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse :<br/>
btn.addEventListener("click", (e) =&gt;<br/>
console.log(e.target)); 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 : debugger; pour mettre un point<br/>
d'arrêt en code ; console.table(arr) pour<br/>
visualiser un tableau ; console.dir(elem)<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>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 &lt;head&gt; sans defer,<br/>
fait document.getElementById("menu") mais<br/>
renvoie null. L'élément id="menu" existe<br/>
bien dans le HTML, sans faute de frappe.<br/>
Pourquoi ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trois solutions : (1) placer le &lt;script&gt; à<br/>
la fin de &lt;body&gt;, (2) &lt;script defer&gt;<br/>
dans &lt;head&gt;, (3) document.addEventListener<br/>
("DOMContentLoaded", ...).</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'id 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 le parsing du DOM</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si &lt;script&gt; est dans<br/>
&lt;head&gt; sans defer, il s'exécute avant<br/>
le &lt;body&gt;. Solutions : placer le<br/>
script en bas du &lt;body&gt;, utiliser<br/>
defer, ou encapsuler dans un<br/>
écouteur DOMContentLoaded.</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 "5" + 3 en JavaScript ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Comparaison : "5" - 3 = 2 (le - force<br/>
la conversion en nombre). Imprévisible :<br/>
toujours convertir explicitement avec<br/>
Number(s) ou parseInt(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="100" format="html">
    <text><![CDATA[<p>"53"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec +, 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 el.innerHTML = userInput; 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 innerHTML. Préférer<br/>
textContent, 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 l'affectation ralentit l'affichage de la page</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas d'impact significatif sur la<br/>
performance ; le danger est ailleurs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un utilisateur peut injecter du code (faille XSS)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si userInput contient<br/>
par exemple &lt;img src=x onerror="..."&gt;,<br/>
le code du gestionnaire s'exécute dans le<br/>
navigateur (les &lt;script&gt; insérés via<br/>
innerHTML ne s'exécutent pas, mais les<br/>
gestionnaires d'événements, si). Solution :<br/>
utiliser textContent (qui échappe) ou<br/>
assainir l'entrée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que innerHTML serait totalement 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, le navigateur filtre le contenu</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le navigateur n'assainit pas<br/>
innerHTML ; 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>addEventListener permet d'ajouter plusieurs gestionnaires d'événements à un élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : avantage majeur sur onclick =.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>document.getElementById(id) renvoie le premier élément ou null</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : comportement standard.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>== et === sont synonymes en JavaScript</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : == fait<br/>
une comparaison <strong>avec coercition</strong> (donc<br/>
parfois surprenante : 0 == false,<br/>
"" == 0...) ; === 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 : const et mutation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le code suivant est-il permis en JavaScript ?</p>
<p>`<code>javascript<br/>
const t = [1];<br/>
t.push(2);<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>const garantit que le nom pointe toujours vers<br/>
le même objet ; il ne garantit pas que cet objet<br/>
reste inchangé. Recommandation moderne : const<br/>
par défaut, let seulement quand la variable doit<br/>
être réaffectée, jamais var.</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>Oui : const interdit la réaffectation de t, pas la modification du tableau</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : const fige le <strong>lien</strong> entre<br/>
le nom t et le tableau, pas le tableau<br/>
lui-même. Après le push, t vaut [1, 2].<br/>
En revanche, t = [9]; lèverait une<br/>
TypeError (réaffectation interdite).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non : une TypeError est levée, car t est déclaré constant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur classique : croire que const rend la<br/>
valeur immuable. La TypeError ne survient<br/>
que pour une <strong>réaffectation</strong> (t = ...),<br/>
pas pour une mutation comme push.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non : il faudrait déclarer t avec let pour pouvoir le modifier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : let n'est nécessaire que pour<br/>
<strong>réaffecter</strong> la variable. Muter le tableau<br/>
(ajouter, retirer, modifier des éléments) est<br/>
permis même avec const.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, mais t vaut toujours [1] : le push est ignoré en silence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : rien n'est ignoré, const ne protège<br/>
pas le contenu du tableau. Le push s'exécute<br/>
normalement et t vaut [1, 2]. Pour geler<br/>
le contenu, il faudrait Object.freeze(t).</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 actif à un élément el<br/>
sélectionné via querySelector, quelle instruction<br/>
utiliser en JavaScript moderne ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Avantages de classList : on n'écrase pas les<br/>
autres classes, le code est lisible, et<br/>
toggle("actif") 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>el.style.actif = true</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la propriété style permet de<br/>
modifier les styles <strong>inline</strong>, pas la liste<br/>
des classes. Il n'existe pas de style<br/>
actif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>el.addClass("actif")</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : addClass 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>el.classList.add("actif")</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la propriété classList<br/>
fournit une API dédiée à la gestion des<br/>
classes : add, remove, toggle,<br/>
contains. 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/>
className, pas class (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 document.getElementById("titre")<br/>
et document.querySelector("#titre") ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique : utiliser getElementById quand<br/>
on cible précisément un identifiant ;<br/>
querySelector lorsqu'on a besoin d'un sélecteur<br/>
complexe (par exemple nav &gt; a.actif:first-child).<br/>
Pour récupérer plusieurs éléments,<br/>
querySelectorAll renvoie une NodeList<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 : getElementById renvoie un seul<br/>
élément (ou null). C'est getElementsByClassName<br/>
ou querySelectorAll qui renvoient une<br/>
collection.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>null pour le second, car querySelector ne fonctionne que sur les pages chargées par AJAX</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : querySelector fonctionne sur tout<br/>
élément du DOM, quel que soit son mode de<br/>
chargement, et accepte le sélecteur #titre.</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/>
getElementById est plus rapide et plus<br/>
ancienne ; querySelector 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 : getElementById cible bien un<br/>
identifiant (pas une classe), et renvoie donc<br/>
ici l'élément. querySelector, lui, accepte<br/>
tout sélecteur CSS, dont les classes<br/>
(.maClasse).</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
