⚙️ 🤖 SPA-Swap lädt lazy-Cover-Bilder nicht — erst nach Reload sichtbar #62
Labels
No labels
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority/Critical
Priority/High
Priority/Low
Priority/Medium
Reviewed/Confirmed
Reviewed/Duplicate
Reviewed/Invalid
Reviewed/Won't Fix
Status/Abandoned
Status/Blocked
Status/Need More Info
Status/Needs-v00-Abnahme
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Zentonic/zentonic-publisher#62
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
██░░░░░░░░████████░░█████████░███████░░░███████░░░Symptom (Holm)
Nach Klick „zurueck zur Uebersicht" (SPA-Swap zur Index) werden die Episoden-Cover nicht geladen (nur Alt-Text sichtbar). Nach echtem Reload alles korrekt.
Root Cause
Die Cover-
<img>habenloading="lazy"(index.html.j2, gerendert.zt-ep-card__cover img). Der SPA-Router (base.html.j2 swapMain) parst das gefetchte HTML pernew DOMParser().parseFromString(...)(inertes Dokument, kein Rendering/Loading) und fuegt#main-contentperreplaceWith(newMain)ein. Beim Adoptieren aus dem inerten Doc triggert der Browser das Lazy-Loading der<img>nicht neu — sie bleiben ungeladen bis ein Scroll-/Layout-Event (oder Reload).Achtung Verifikation: Headless-Chromium laedt
loading="lazy"faktisch eager → der Bug ist im Headless-CDP nicht reproduzierbar (dort erscheinen die Bilder geladen,naturalWidth>0). Verifikation MUSS headful erfolgen (echter Browser / xvfb + sichtbares Fenster), sonst falsch-gruen.Fix (klein, in
swapMainnach dem Einfuegen bzw. ininitPage)Fuer die geswappten
<img>das Laden erzwingen, z.B.:Alternativen:
img.loading='eager'generell fuer geswappte Cover (sind nach Swap ohnehin oft above-fold); oder das gefetchte HTML statt DOMParser viadocument.createRange().createContextualFragment()einbinden (adoptiert im Live-Kontext) — dann aber trotzdem lazy-Trigger pruefen.Verify (PFLICHT headful)
Echter Browser (nicht headless): Folge/Episode oeffnen → „zurueck zur Uebersicht" → alle Cover sofort sichtbar ohne Scroll/Reload. Auch: Card→Episode→zurueck mehrfach. Live/Chat + nahtloses Audio unveraendert.
Verlinkt #58 (SPA-Umbau). Der SPA-Kern funktioniert; dies ist der uebersehene Lazy-Image-Teil.
#62 gefixt — SPA-Swap re-triggert lazy-Cover (headful-bewiesen)
Gemerged nach
dev(6cb9983, Branchfix/62-spa-lazy-img).Root Cause:
swapMain()adoptiert das neue<main>aus einem inertenDOMParser-Doc viareplaceWith— der Browser triggert das Lazy-Loading der<img loading="lazy">dabei nicht neu → Cover bleiben leer bis Scroll/Reload.Fix (in
swapMain, nachreplaceWith):Hinweis:
img.setAttribute('src', src)mit gleichem Wert ist in Chromium 149 ein No-Op (löst kein Reload aus) — daherloading='eager'.HEADFUL verifiziert (Xvfb + non-headless Chromium 149, Viewport 400×600, Cover unter dem Fold):
naturalWidth=0/complete=false(Bug reproduziert).naturalWidth>0,complete=true) ohne Scroll.Methodik-Lehre: headless-Chromium lädt
loading="lazy"eager → dieser Bug ist NUR headful reproduzierbar. Künftige visuelle JS-Abnahmen headful (Xvfb) fahren.Für v00: headful-Endabnahme (Episode→zurück→alle Cover sofort da).