Auffang-Element in app.js: ein fehlendes Element bricht nicht mehr den Render

Gemessen: 95 direkte $("id")-Zugriffe, 0 davon abgesichert - obwohl die Regel
"neue Elemente per const el = $(..); if (el) {..}" seit 01.08. in CLAUDE.md
steht. Eine Regel mit 0 Prozent Befolgung ist keine Regel, also loest es jetzt
der Code an EINER Stelle statt an 95.

$() gibt bei fehlendem Element ein detachiertes <span> zurueck statt null,
plus einmalige console.warn je ID (kein stiller Fallback - das war der
catch{}-Fehler in pollSnapshot).

?. war NICHT die Loesung: 80 der 95 Zugriffe sind Zuweisungen, und
$("x")?.y = v ist ein Syntaxfehler.

$streng() ist der wichtige Teil. Alle Eingabefelder sind type="number", und
leer heisst dort ausdruecklich "Stop entfernen" (sl: null). Mit dem
Auffang-Element waere .value undefined -> parseFloat NaN -> JSON.stringify
macht daraus wieder null: eine fehlende Eingabemaske haette den Broker-SL
einer laufenden Position stillschweigend geloescht. Betroffen war genau eine
Funktion (sendSltp); setSrMin/setEmg/setManualMargin/setMarginPct fangen NaN
bereits ab (geprueft, nicht angenommen).

Beide Richtungen an einem Minimal-DOM verifiziert, das eine alte index.html
simuliert: mit der alten $-Definition bricht der Render beim ZWEITEN Feld ab,
mit der neuen laeuft er durch. Der Order-Pfad bricht in beiden Faellen sauber
ab.

Asset-Version v=149 -> v=150.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-07 07:34:01 +02:00
co-authored by Claude Opus 5
parent e7112e1ab6
commit 3e8fa9fea8
3 changed files with 88 additions and 6 deletions
+35 -1
View File
@@ -226,6 +226,40 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
```
Gegenprobe nach jedem Kompilieren: `#property version` im Terminal-`.mq5` **und**
der Zeitstempel der `.ex5` müssen zum erwarteten Stand passen.
- **✅⚠ AUFFANG-ELEMENT statt Disziplin (Fix 2026-08-07, v=150) — die Regel
direkt darunter wird jetzt vom CODE durchgesetzt.** `$()` gibt bei fehlendem
Element nicht mehr `null` zurück, sondern ein **detachiertes `<span>`**:
```js
const _FEHLT = document.createElement("span");
const $ = (id) => document.getElementById(id) || _FEHLT; // + 1× console.warn je ID
const $streng = (id) => document.getElementById(id); // gibt null
```
⚠⚠ **Anlass ist eine Messung, kein Gefühl: die Regel „neue Elemente per
`const el = $(…); if (el) {…}`" war bei 0 von 95 direkten Zugriffen befolgt.**
95 Stellen, an denen ein fehlendes Element den **GESAMTEN** Render abbricht;
0 davon abgesichert. Eine Regel mit 0 % Befolgung ist keine Regel — deshalb
löst es der Code an EINER Stelle statt an 95.
**`?.` war NICHT die Lösung** (mein erster Vorschlag, und er war falsch):
**80 der 95** Zugriffe sind ZUWEISUNGEN, und `$("x")?.y = v` ist ein
**Syntaxfehler** — Optional Chaining ist links vom `=` verboten.
⚠⚠ **`$streng` ist der wichtige Teil.** Alle Eingabefelder sind
`type="number"`, und **leer heißt dort ausdrücklich „Stop entfernen"**
(`sl: null`). Mit dem Auffang-Element wäre `.value` `undefined``parseFloat`
→ NaN → `JSON.stringify` macht daraus wieder **`null`** — eine fehlende
Eingabemaske hätte den **Broker-SL einer laufenden Position stillschweigend
gelöscht.** Ein lauter Absturz ist dort das bessere Verhalten. Betroffen war
genau **eine** Funktion (`sendSltp`); `setSrMin`/`setEmg`/`setManualMargin`/
`setMarginPct` fangen NaN bereits ab (geprüft, nicht angenommen).
⚠ Der Fehler wird **nicht verschluckt**, sondern **1× je ID** in die Konsole
gemeldet — ein stiller Fallback wäre derselbe Fehler wie der `catch {}` in
`pollSnapshot`, der Render-Fehler lautlos gefressen hat (behoben 01.08.).
**Beide Richtungen verifiziert** an einem Minimal-DOM, das eine alte
`index.html` simuliert: mit der alten `$`-Definition bricht der Render beim
**zweiten** Feld ab, mit der neuen läuft er durch und nur die fehlenden Felder
bleiben leer; der Order-Pfad bricht in beiden Fällen sauber ab.
⚠ Die 40 vorhandenen `if (!el) return;`-Wächter feuern jetzt nicht mehr. Sie
bleiben stehen (kein Nutzen im Entfernen, und sie greifen weiter, wenn jemand
`$streng` benutzt) — beim Lesen aber mitdenken.
- **⚠ NEUE HTML-Elemente IMMER null-sicher ansprechen (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 (`$("neu").textContent = …`)
@@ -4117,7 +4151,7 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
(„⚠ die Welle (steuert die Order) schweigt").
Live gegengerechnet, beide Zeilen erscheinen wie beabsichtigt.
⚠ Reine Anzeige — an Gewichten, Gates und Order-Logik ist nichts geändert.
- Asset-Version aktuell **v=149** (in `web/index.html` hochzählen, siehe Workflows).
- Asset-Version aktuell **v=150** (in `web/index.html` hochzählen, siehe Workflows).
Schriftgrößen 2026-07-24 global **+4px** (2× je +2px auf User-Wunsch; Body-Basis
14→18px). ⚠ Betrifft in `style.css` sowohl `font-size:Npx` (71×) ALS AUCH die
`font:<weight> Npx/…`-**Shorthand** (3×: `.ms-chip`/`.ms-bos-lbl`/`.sqm-badge`