Réattache toujours les gestionnaires de clic après un rafraîchissement de données
Test de diagnostic déterminant : après le blocage rapporté (plus aucune ligne de Répéteur ne répond après le tout premier clic), appeler manuellement bindClicks() dans la console suffisait à tout réparer — donc ni le DOM ni le graphe de logique n'étaient en cause, seule l'INVOCATION de bindClicks() manquait à un moment donné. Cause : refreshRuntimeData() faisait un retour anticipé silencieux (`if (!screenData || !screenDiv) return;`) qui sautait, avec lui, TOUT le reste de la fonction — y compris bindClicks(), bindHoverTexts() et bindHoverTriggers() — sans le moindre message d'erreur, laissant les éléments régénérés (Répéteur compris) sans aucun écouteur pour le reste de la partie. Fix : ce garde-fou ne protège plus désormais que le bloc de régénération du contenu de l'écran (qui a effectivement besoin de screenData/ screenDiv) ; les réattachements, eux, s'exécutent toujours ensuite, quoi qu'il arrive. Un try/catch autour de la régénération ajoute en prime un filet de sécurité : toute erreur inattendue s'y loggera clairement au lieu de bloquer silencieusement le reste, si jamais ce n'était pas l'unique cause. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
024da11934
commit
ca7daf9a31
+33
-15
@@ -411,21 +411,39 @@
|
|||||||
screensData = gameData.screens;
|
screensData = gameData.screens;
|
||||||
const screenData = screensData.find(s => s.id === window.currentScreenId);
|
const screenData = screensData.find(s => s.id === window.currentScreenId);
|
||||||
const screenDiv = document.querySelector('.playScreen[data-screen-id="' + window.currentScreenId + '"]');
|
const screenDiv = document.querySelector('.playScreen[data-screen-id="' + window.currentScreenId + '"]');
|
||||||
if (!screenData || !screenDiv) return;
|
// Le bloc ci-dessous (régénération du contenu de l'écran courant)
|
||||||
screenData.elements.filter(function(e){ return !e.parent_id; }).forEach(function(el) {
|
// est sauté si l'écran n'est pas trouvé, mais bindClicks() et les
|
||||||
if (!el.rendered_html) return;
|
// autres réattachements juste après ne doivent JAMAIS dépendre de
|
||||||
// "repeaterItem" (liste de données), "jaugeBar" (2.1 — jauge liée
|
// cette condition : un retour anticipé ici a déjà laissé, dans la
|
||||||
// à une donnée) et "visibilityGated" (condition de visibilité —
|
// pratique, un Répéteur fraîchement régénéré sans AUCUN gestionnaire
|
||||||
// voir render_element_html.py) sont les types d'éléments dont le
|
// de clic pour le reste de la partie (plus aucune ligne ne
|
||||||
// contenu/l'affichage dépend de la donnée elle-même plutôt que
|
// répondait, silencieusement, sans erreur) — ces fonctions sont sans
|
||||||
// d'une action "Modifier un élément" posée à la main dans le
|
// risque à rappeler même quand rien n'a changé.
|
||||||
// graphe — eux seuls doivent être régénérés après un changement
|
if (screenData && screenDiv) {
|
||||||
// de donnée ou de variable.
|
// try/catch : une erreur inattendue pendant la régénération (ex.
|
||||||
if (el.rendered_html.indexOf('repeaterItem') === -1 && el.rendered_html.indexOf('jaugeBar') === -1 && el.rendered_html.indexOf('visibilityGated') === -1) return;
|
// structure de données imprévue) ne doit jamais empêcher les
|
||||||
const wrapper = screenDiv.querySelector('.playElement[data-el-id="' + el.id + '"] .playElementInner');
|
// réattachements ci-dessous de s'exécuter — sinon le Répéteur (ou
|
||||||
if (wrapper) wrapper.innerHTML = el.rendered_html;
|
// tout autre élément cliquable) reste silencieusement inerte pour
|
||||||
});
|
// le reste de la partie, sans le moindre message d'erreur visible.
|
||||||
applyOpenRowBindings();
|
try {
|
||||||
|
screenData.elements.filter(function(e){ return !e.parent_id; }).forEach(function(el) {
|
||||||
|
if (!el.rendered_html) return;
|
||||||
|
// "repeaterItem" (liste de données), "jaugeBar" (2.1 — jauge liée
|
||||||
|
// à une donnée) et "visibilityGated" (condition de visibilité —
|
||||||
|
// voir render_element_html.py) sont les types d'éléments dont le
|
||||||
|
// contenu/l'affichage dépend de la donnée elle-même plutôt que
|
||||||
|
// d'une action "Modifier un élément" posée à la main dans le
|
||||||
|
// graphe — eux seuls doivent être régénérés après un changement
|
||||||
|
// de donnée ou de variable.
|
||||||
|
if (el.rendered_html.indexOf('repeaterItem') === -1 && el.rendered_html.indexOf('jaugeBar') === -1 && el.rendered_html.indexOf('visibilityGated') === -1) return;
|
||||||
|
const wrapper = screenDiv.querySelector('.playElement[data-el-id="' + el.id + '"] .playElementInner');
|
||||||
|
if (wrapper) wrapper.innerHTML = el.rendered_html;
|
||||||
|
});
|
||||||
|
applyOpenRowBindings();
|
||||||
|
} catch (err) {
|
||||||
|
console.error('refreshRuntimeData: erreur pendant la régénération de l\'écran', err);
|
||||||
|
}
|
||||||
|
}
|
||||||
bindClicks();
|
bindClicks();
|
||||||
bindHoverTexts();
|
bindHoverTexts();
|
||||||
bindHoverTriggers();
|
bindHoverTriggers();
|
||||||
|
|||||||
Reference in New Issue
Block a user