Inline PDF-Vorschauen setzen sich beim Scrollen durch ein Thema auf Seite 1 zurück

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

  1. Erstellen Sie ein Thema mit einem PDF-Anhang.
  2. Stellen Sie sicher, dass die Komponente „Inline PDF Previews“ aktiv ist.
  3. Scrollen Sie durch das Thema, bis der Beitrag, der die PDF-Vorschau enthält, den sichtbaren Bereich verlässt.
  4. Scrollen Sie zurück zu derselben PDF-Vorschau.
  5. 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.

1 „Gefällt mir“