Avertit avant la perte des réponses sur les trois TD
Les réponses saisies dans les exercices ne sont pas enregistrées : un rechargement ou une navigation les efface sans prévenir. Ajoute sur BioCID, FDS et TP Nuisibles un indicateur de saisie et un gestionnaire beforeunload : dès qu'une réponse a été renseignée, le navigateur demande confirmation avant de recharger ou de quitter la page. Aucune alerte tant que rien n'a été saisi. Sur FDS, les parties glisser-déposer, liaisons FT et zones cliquables de l'étiquette ne produisent pas d'événement input : elles signalent la saisie explicitement. Même chose pour le choix du cas pratique du TP. Note : le texte affiché dans la boîte de dialogue est imposé par le navigateur et n'est pas personnalisable.
This commit is contained in:
@@ -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();
|
||||
</script>
|
||||
</body>
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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, '<').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();
|
||||
</script>
|
||||
</body>
|
||||
|
||||
Reference in New Issue
Block a user