Zusammenfassung
Inline-PDF-Vorschauen setzen ihre Scroll-Position (zurück auf Seite 1) konsistent zurück, wenn man durch ein langes Thema scrollt. Dies geschieht, weil das PDF-Embed zerstört und neu eingefügt wird, wenn der Beitrag aus dem Sichtfeld scrollt, wahrscheinlich aufgrund des Post-Stream-Recyclings/-Virtualisierung von Discourse.
Dies betrifft alle Browser, alle PDFs und tritt selbst bei deaktivierten Plugins und Themes auf.
Reproduktionsschritte
- Erstellen Sie ein Thema mit einem PDF-Anhang.
- Stellen Sie sicher, dass die Komponente „Inline PDF Previews“ aktiv ist.
- Scrollen Sie durch das Thema, bis der Beitrag, der die PDF-Vorschau enthält, den sichtbaren Bereich verlässt.
- Scrollen Sie zurück zu derselben PDF-Vorschau.
- Ergebnis:
- Das PDF wird vom Anfang neu geladen.
- Die Scroll-Position der Vorschau geht verloren.
- Die PDF wird neu gerendert, als wäre sie frisch geladen worden.
Es wird keine Netzwerkanfrage für das PDF ausgelöst, was darauf hindeutet, dass der DOM-Knoten lokal entfernt und neu erstellt wurde.
Erwartetes Verhalten
- Die PDF-Vorschau sollte ihre Scroll-Position beibehalten und nicht einfach durch das Scrollen des Themas neu geladen werden.
- Andere eingebettete Inhalte (Bilder, Videos, Oneboxes) setzen ihren Zustand beim Scrollen nicht zurück; PDF-Vorschauen sollten sich konsistent verhalten.
Tatsächliches Verhalten
- Sobald der Beitrag außerhalb des sichtbaren Bereichs gerät, entlädt Discourse den DOM-Knoten.
- Wenn der Beitrag wieder in den sichtbaren Bereich scrollt, wird das Embed neu aufgebaut.
- Dies zwingt den nativen PDF-Renderer des Browsers, erneut bei Seite 1 zu beginnen.
- Dies geschieht jedes Mal, wenn der Beitrag den sichtbaren Bereich verlässt (nach oben oder unten).
Umgebung
- Tritt in allen getesteten Browsern auf: Chrome, Firefox, Safari, Edge
- Tritt bei allen deaktivierten Plugins auf (Sicherer Modus)
- Tritt bei allen deaktivierten Theme-Komponenten auf
- Tritt bei mehreren PDF-Dateien unterschiedlicher Größe und Formate auf
- Tritt auf dem neuesten Branch von Discourse (tests-passed) auf (Stand des Veröffentlichungsdatums)
Technische Hinweise
Discourse scheint nicht sichtbare Beitrags-Komponenten im Rahmen der Stream-Virtualisierung auszubauen (unmounting). Da die PDF-Vorschau ein einfaches \<embed\> / \<iframe\> verwendet, verfügt sie über keinen Persistenzmechanismus und wird daher bei jedem Ereignis vollständig zurückgesetzt:
willDestroyElement()wird ausgelöst- der Container des Beitrags wird neu gerendert
- der DOM-Knoten wird bei erneutem Betreten des sichtbaren Bereichs neu erstellt
Dies ist einzigartig für PDFs, da native PDF-Viewer des Browsers den Scroll-Zustand bei einer DOM-Rekonstruktion nicht beibehalten.
Dies macht lange Themen mit PDFs frustrierend zu lesen, insbesondere bei mehrseitigen Anhängen.
Gewünschte Lösung
- Verhindern, dass die Komponente „Inline PDF Preview“ während des Beitrags-Recyclings zerstört wird ODER
- Eine Möglichkeit für Plugin-/Theme-Komponenten bereitstellen, „persistente Zustände“ zu deklarieren, damit Discourse sie nicht ausbaut
- Oder eine Site-Einstellung bereitstellen, um das Recycling von Beiträgen zu deaktivieren, die Inline-PDF-Viewer enthalten
Selbst eine Teillösung – z. B. das Überspringen des Recyclings für Beiträge, die PDF-Embeds enthalten – würde das Problem lösen.
Zusätzlicher Kontext
Dies ist kein einmaliges Umgebungsproblem: Es wurde zuverlässig unter sauberen Test-Builds, mehreren Browsern und über verschiedene PDFs hinweg reproduziert.
Es gibt keine Meta-Themen, die dieses Verhalten beschreiben, daher könnte es sich um eine nicht gemeldete Regression oder eine unbeabsichtigte Folge von Verbesserungen der Stream-Virtualisierung handeln.