From fe0bfa62c6e04380ee3308857f0e0781cb60315a Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Sat, 30 May 2026 09:13:03 +0300 Subject: [PATCH] =?UTF-8?q?fix(phys9=20legacy):=20null-guard=20=D0=B2=20re?= =?UTF-8?q?nderTask=20+=20try/catch=20=D0=B2=D0=BE=D0=BA=D1=80=D1=83=D0=B3?= =?UTF-8?q?=20=D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ошибка: renderTask() падал на secций, отсутствующих на странице ch1 (нет элементов #sum, #taskArea, #fb) — getElementById возвращал null, .classList.remove падал → IIFE прерывался → экспорт функций в window не выполнялся → startAnim1 is not defined. Фиксы: 1. renderTask: early return если area/fb/sum/pool/s — null. 2. Инициализационный forEach обёрнут в try/catch + per-item try/catch. 3. setParaTab('p1') и блок upd2..upd12 обёрнуты в try/catch (некоторые элементы могут отсутствовать на отдельных ch-страницах). Теперь экспорт функций гарантированно выполняется до конца файла. Co-Authored-By: Claude Opus 4.7 --- frontend/js/phys9_legacy.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/js/phys9_legacy.js b/frontend/js/phys9_legacy.js index c5449a6..7e3dfdd 100644 --- a/frontend/js/phys9_legacy.js +++ b/frontend/js/phys9_legacy.js @@ -2737,7 +2737,9 @@ function renderTask(sec) { const s = STATE[sec]; const area = document.getElementById('taskArea' + sec); const fb = document.getElementById('fb' + sec); - document.getElementById('sum' + sec).classList.remove('show'); + const sum = document.getElementById('sum' + sec); + if (!area || !fb || !sum || !pool || !s) return; // секция отсутствует на этой странице + sum.classList.remove('show'); const q = pool[s.idx]; const done = s.results[s.idx] !== null; @@ -5836,9 +5838,11 @@ if (refToggle && refPanel) { // ══════════════════════════════════════════════ // ИНИЦИАЛИЗАЦИЯ // ══════════════════════════════════════════════ -['p1','p2','p3','p4','p5','p6','p7','p8','p9','p10','p11','p12','p13','p14','p15','p16','p17','p18','p19','p20','p21','p22','p23','p24','p25','p26','p27','p28','p29','p30','p31','p32','p33','p34','p35','p36','hard'].forEach(sec => renderTask(sec)); -setParaTab('p1'); -upd2(); upd3(); upd4(); upd5(); upd6(); upd7(); upd8(); upd10(); upd11(); upd12(); +try { + ['p1','p2','p3','p4','p5','p6','p7','p8','p9','p10','p11','p12','p13','p14','p15','p16','p17','p18','p19','p20','p21','p22','p23','p24','p25','p26','p27','p28','p29','p30','p31','p32','p33','p34','p35','p36','hard'].forEach(sec => { try { renderTask(sec); } catch(e){} }); +} catch(e) {} +try { setParaTab('p1'); } catch(e) {} +[upd2,upd3,upd4,upd5,upd6,upd7,upd8,upd10,upd11,upd12].forEach(fn => { try { fn(); } catch(e){} }); try { upd16(); upd17(); upd19(); upd20(); upd21();