Dashboard fror bei gecachter alter HTML ein - neue Elemente jetzt null-sicher

User: "ich sehe die Aenderungen nicht im dashboard". Server war korrekt:
v=129 samt #hdr-hl ausgeliefert, Cache-Control: no-store gesetzt, kein
Service-Worker, hl_live im Snapshot vorhanden.

Ursache: index.html und app.js werden vom Browser UNABHAENGIG gecacht.
Trifft neue JS auf eine alte, gecachte HTML, wirft
$("hdr-price-lbl").textContent = ... eine TypeError - und weil das mitten in
render() passiert, bricht der GESAMTE Render ab. Das Dashboard friert ein
und zeigt Altwerte, obwohl alles andere stimmt. Genau das Symptom.

Fix: neue Elemente ueber const el = $("id"); if (el) { ... } ansprechen.
Dann laeuft der Rest weiter und nur das neue Feld fehlt, bis die HTML
nachgeladen ist. Betrifft hdr-price-lbl und hdr-hl.

Regel in CLAUDE.md aufgenommen - das ?v=N-Bump bustet nur app.js/style.css,
NICHT die index.html selbst.

v=130.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-01 11:13:53 +02:00
co-authored by Claude Opus 5
parent 7427c36922
commit 2ea17ce3e0
3 changed files with 31 additions and 9 deletions
+16 -6
View File
@@ -482,15 +482,25 @@ function render(d) {
// stillen Vertauschung).
$("hdr-price").textContent = m.bid != null ? fmt(m.bid) : "—";
$("hdr-price").className = priceCls;
$("hdr-price-lbl").textContent = d.market_closed ? "KURS · ZU" : "KURS";
$("hdr-price-lbl").title = d.market_closed
? `Pepperstone geschlossen — letzter Tick vor ${Math.round((d.tick_age_s || 0) / 60)} min`
: "";
// ⚠ NULL-SICHER auf NEUE Elemente zugreifen (Fix 2026-08-01): `index.html` und
// `app.js` werden vom Browser UNABHÄNGIG gecacht. Trifft neue JS auf eine alte,
// gecachte HTML, wirft ein direkter Zugriff auf ein noch nicht existierendes
// Element eine TypeError — und weil das mitten in `render()` passiert, bricht der
// GESAMTE Render ab: das Dashboard friert ein und zeigt Altwerte. Genau so sah der
// Fehler beim Nutzer aus („ich sehe die Änderungen nicht"). Mit Guard läuft der
// Rest normal weiter, nur die neuen Felder fehlen, bis die HTML nachgeladen ist.
const lblEl = $("hdr-price-lbl");
if (lblEl) {
lblEl.textContent = d.market_closed ? "KURS · ZU" : "KURS";
lblEl.title = d.market_closed
? `Pepperstone geschlossen — letzter Tick vor ${Math.round((d.tick_age_s || 0) / 60)} min`
: "";
}
// Hyperliquid daneben: basis-korrigiert (= MT5-Niveau), mit Abweichung im Tooltip.
const hl = d.hl_live || null;
const hlEl = $("hdr-hl");
if (hl && hl.mid_mt5 != null) {
if (hlEl && hl && hl.mid_mt5 != null) {
const arr = hl.trend === "up" ? "▲" : hl.trend === "down" ? "▼" : "";
hlEl.textContent = fmt(hl.mid_mt5) + (arr ? " " + arr : "");
const dv = hl.vs_mt5;
@@ -500,7 +510,7 @@ function render(d) {
+ `${hl.basis >= 0 ? "+" : ""}${fmt(hl.basis, 3)} = ${fmt(hl.mid_mt5)} · `
+ `${fmt(hl.age_s, 0)} s alt`
+ (dv != null ? ` · ggü. Broker ${dv >= 0 ? "+" : ""}${fmt(dv, 3)}` : "");
} else {
} else if (hlEl) {
hlEl.textContent = "—"; hlEl.className = ""; hlEl.title = "";
}