diff --git a/exercices/Exo_BioCID.html b/exercices/Exo_BioCID.html index 563e1db..b6da2a2 100644 --- a/exercices/Exo_BioCID.html +++ b/exercices/Exo_BioCID.html @@ -859,6 +859,21 @@ function exporterPDF() { setTimeout(() => w.print(), 300); } +/* ======================== PROTECTION CONTRE LA PERTE DES RÉPONSES ======================== */ +/* Les réponses ne sont pas enregistrées : on avertit avant tout rechargement ou départ. + Le texte de la boîte est imposé par le navigateur, il n'est pas personnalisable. */ +let reponsesModifiees = false; +function marquerModifie() { reponsesModifiees = true; } + +document.addEventListener('input', marquerModifie, true); +document.addEventListener('change', marquerModifie, true); + +window.addEventListener('beforeunload', e => { + if (!reponsesModifiees) return; + e.preventDefault(); + e.returnValue = ''; +}); + updateUI(); diff --git a/exercices/Exo_FDS.html b/exercices/Exo_FDS.html index 9a336da..dad8fe6 100644 --- a/exercices/Exo_FDS.html +++ b/exercices/Exo_FDS.html @@ -1113,6 +1113,7 @@ function onEtiClick(e) { // Exercice terminé : plus d'interaction (les corrections sont dans la correction générale) if (etiPos >= etiOrder.length) return; + marquerModifie(); const target = etiZones[etiOrder[etiPos]]; if (clicked === target.zone) { hs.classList.remove('hs-wrong'); @@ -1356,7 +1357,7 @@ document.addEventListener('pointerup', e => { if (!ftDrag) return; const target = document.elementFromPoint(e.clientX, e.clientY); const answerDot = target && target.closest('.match-dot[data-side="right"]'); - if (answerDot) ftConnections[ftDrag.qid] = answerDot.dataset.answer; + if (answerDot) { marquerModifie(); ftConnections[ftDrag.qid] = answerDot.dataset.answer; } document.querySelectorAll('.match-dot.active').forEach(d => d.classList.remove('active')); ftDrag = null; refreshFtState(); @@ -1407,6 +1408,7 @@ function initFdsDnd() { r.className = 'result-message'; r.innerHTML = ''; }; const fill = (slot, v, l) => { + marquerModifie(); slot.dataset.value = v; slot.textContent = l; slot.classList.add('filled'); resetResults(); updateFdsGate(); }; @@ -1820,6 +1822,23 @@ function launchConfetti() { rafId = requestAnimationFrame(draw); } +/* ======================== PROTECTION CONTRE LA PERTE DES RÉPONSES ======================== */ +/* Les réponses ne sont pas enregistrées : on avertit avant tout rechargement ou départ. + Le texte de la boîte est imposé par le navigateur, il n'est pas personnalisable. */ +let reponsesModifiees = false; +function marquerModifie() { reponsesModifiees = true; } + +// Les champs texte déclenchent input/change ; les parties FDS (glisser-déposer), +// FT (liaisons) et Étiquette (zones cliquables) appellent marquerModifie() directement. +document.addEventListener('input', marquerModifie, true); +document.addEventListener('change', marquerModifie, true); + +window.addEventListener('beforeunload', e => { + if (!reponsesModifiees) return; + e.preventDefault(); + e.returnValue = ''; +}); + document.addEventListener('DOMContentLoaded', () => { generateQuizzes(); updateUI(); diff --git a/exercices/TP_Nuisibles.html b/exercices/TP_Nuisibles.html index ef4c76d..dbf1964 100644 --- a/exercices/TP_Nuisibles.html +++ b/exercices/TP_Nuisibles.html @@ -1317,6 +1317,7 @@ function updateUI() { } function selectCase(key, icon, title, desc) { + marquerModifie(); selectedCase.key = key; selectedCase.icon = icon; selectedCase.title = title; @@ -1620,6 +1621,21 @@ function escapeHtml(str) { return str.replace(/&/g, '&').replace(//g, '>'); } +/* ======================== PROTECTION CONTRE LA PERTE DES RÉPONSES ======================== */ +/* Les réponses ne sont pas enregistrées : on avertit avant tout rechargement ou départ. + Le texte de la boîte est imposé par le navigateur, il n'est pas personnalisable. */ +let reponsesModifiees = false; +function marquerModifie() { reponsesModifiees = true; } + +document.addEventListener('input', marquerModifie, true); +document.addEventListener('change', marquerModifie, true); + +window.addEventListener('beforeunload', e => { + if (!reponsesModifiees) return; + e.preventDefault(); + e.returnValue = ''; +}); + updateUI();