Ausgezeichnet! Danke @Johani. Ich kann bestätigen, dass es jetzt in allen drei Browsern funktioniert.
Fantastisch – das sind solide Verbesserungen, die eindeutig viel Arbeit erfordert haben. Vielen Dank, dass ihr uns etwas nervige Mitverschwörer aus der Welt der Selbsthosting-Lösungen angehört habt!
Funktioniert die Komponente jetzt mit S3-Uploads?
Ich habe es noch nicht getestet, aber es sollte funktionieren, wenn dein Bucket korrekt konfiguriert ist. Diese Komponente stellt eine Anfrage, um das PDF zu laden.
Solche in JavaScript getätigten Anfragen werden blockiert, wenn der Ursprung keinen Zugriff auf die Datei hat. In diesem Fall tritt ein CORS-Fehler auf. Wenn du die Konsole prüfst, siehst du wahrscheinlich etwas Ähnliches wie hier:

Die Komponente kann daran wenig ändern. Dies muss alles in deiner S3-Konfiguration geregelt werden. Der Ursprung – deine Discourse-Domain – muss berechtigt sein, solche Anfragen zu stellen, um CORS-Probleme zu vermeiden.
Danke! Ich werde mich gleich wieder mutig ins S3 stürzen.
Ein weiterer Vorschlag: Tab, wenn ein Leerzeichen vor dem Dateinamen steht
Mein Wunsch ist es, dass PDFs standardmäßig inline angezeigt werden und sich in einem neuen Tab öffnen, wenn ein Leerzeichen im Dateinamen enthalten ist. Das gibt Autoren die Möglichkeit, pro PDF zwischen Inline-Anzeige und Tab zu wählen, statt pro Komponente.
Vielleicht sollte die Komponenteneinstellung stattdessen lauten: „Welches Standardverhalten wünschen Sie?", und wenn ein Leerzeichen eingefügt wird, erfolgt die andere Option.
Alternativ könnte man auch abfragen, was das Leerzeichen bewirken soll (Inline / Tab / Download).
Aargh! Chrome zeigt wieder nur graue Kästen an. FF und Safari sind in Ordnung.
Sendet diese Theme-Komponente die PDF an einen externen Interpreter?
Ich habe „Secure Media" aktiviert, da ich verhindern möchte, dass Dateien von einem externen Dienst geladen werden.
Ich habe herausgefunden, dass dies auf den folgenden Code zurückzuführen ist:
<a class="attachment pdf-attachment" href="...pdf">doc.pdf
<iframe src="blob:...\" height="500" loading="lazy" class="pdf-preview">
</iframe>
</a>
Wenn Sie den obigen Code durch den folgenden ersetzen:
<a class="attachment pdf-attachment" href="...pdf">doc.pdf</a>
<iframe src="blob:...\" height="500" loading="lazy" class="pdf-preview"></iframe>
funktioniert es.
Ich bin mir jedoch nicht sicher, wie man dies im bestehenden Code beheben kann.
@Johani
Der Fehler bezieht sich auf den folgenden Code, Zeile 34 bis 41:
const setUpPreviewType = (pdf) => {
if (previewMode === "Inline") {
const preview = createPreviewElement();
pdf.classList.add("pdf-attachment");
pdf.append(preview);
return preview;
}
Diese Lösung scheint für alle Browser zu funktionieren.
pdf.parentNode.append(preview); scheint zu funktionieren (aber im Fall mehrerer PDFs werden die Vorschauen unter allen Links angezeigt, nicht unter jedem einzelnen).
Aber wenn der parentNode der Absatz ist, sollte dies kein Problem sein, da sich der Link und das iframe innerhalb des Absatz-Tags befinden.
Um dieses Problem zu umgehen, können Sie einfach eine neue Zeile zwischen die Anhänge einfügen:
[doc1.pdf|attachment](...)
[doc2.pdf|attachment](...)
Mit Ihrer Lösung wird die PDF-Vorschau auch in Chrome korrekt angezeigt.
Ich habe gerade einige Änderungen gepusht.
Ja, das ergibt mehr Sinn, als die Datei einfach zu ignorieren. So wird es nach dem Update funktionieren:
-
Wenn du die Einstellung auf „Neuer Tab" setzt, fügt die Komponente keine Vorschau in Beiträgen ein. Wenn du auf den Link klickst, öffnet sich das PDF in einem neuen Tab.
-
Wenn du die Einstellung auf „Inline" setzt, fügt die Komponente standardmäßig für alle PDFs eine Vorschau im Beitrag ein. Wenn der Dateiname mit einem Leerzeichen beginnt, wird keine Vorschau eingefügt, aber beim Klicken auf den Link öffnet sich das PDF in einem neuen Tab, anstatt heruntergeladen zu werden.
Alle nativen Browser-PDF-Viewer verfügen über eine Download-Schaltfläche, sodass du sie dort herunterladen kannst, falls gewünscht.
Danke für das Debugging und die Details @sharewoodsDavid. Es stellt sich heraus, dass <iframe>-Tags innerhalb von <a>-Tags die Validierung nicht bestehen.
Das Element
iframedarf nicht als Nachkomme des Elementsaerscheinen.
Deine Lösung ist also genau richtig. Ich habe diese Änderung im oben genannten PR vorgenommen.
Wenn du ein Element nach einem anderen Element hinzufügen möchtest, kannst du after() wie folgt verwenden:
someElement.after(newElement)
Wenn du ein Element vor einem anderen Element hinzufügen möchtest, kannst du insertBefore() wie folgt verwenden:
// parentNode: der Parent des Elements, vor das du einfügen möchtest
// newNode: das Element, das du einfügen möchtest
// referenceNode: das Element, vor das du einfügen möchtest
parentNode.insertBefore(newNode, referenceNode)
Nein. Es sind keine externen Dienste beteiligt. So funktioniert es:
- Ein Benutzer besucht einen Beitrag mit einem PDF-Anhang.
- Der Browser des Benutzers fordert den Anhang an.
- Der Server sendet ihn an den Browser des Benutzers.
- Der Browser des Benutzers liest ihn mit dem integrierten PDF-Viewer.
Das ist alles.
Perfekt – danke @Johani. Bestätigt, dass es in Chrome, FF und Safari funktioniert. ![]()
Das ist großartig! Vielen Dank. Ich habe es installiert und es funktioniert! Genau das, wonach ich gesucht habe.
Wird dies rückwirkend auf bereits im Forum gepostete PDFs angewendet?
Ich habe gerade auf meiner Testseite getestet, und es scheint, dass es auch für die vorhandenen funktioniert, ohne dass „HTML neu erstellt“ werden muss. ![]()
Ich habe letzte Woche ein Update in der Quelle gesehen, daher gehe ich davon aus, dass diese Komponente funktioniert. Aber leider hat sie bei mir in keinem Browser funktioniert. Liegt es vielleicht an den sicheren “Medieneinstellungen”? Bin ich der Einzige, der das nicht zum Laufen bringt, oder ist das ein häufiges Problem?
Hat bei mir auch nie funktioniert.
Die Komponente funktioniert gut. Welches Problem/welchen Fehler sehen Sie?
Ich habe nur einen gewöhnlichen Download-Link für eine Datei gesehen. Ich habe nicht weiter gegraben, weil es für mich nicht so wichtig war, es wäre schön zu haben, nichts weiter. Also, tut mir leid, aber ich kann das nicht weiter aufhellen.
Bearbeiten
Nun, ich habe es noch einmal überprüft – das letzte Mal war vor einiger Zeit.
DiscourseHub zeigt dies (iPad) und keine Fehler in den Protokollen von Discourse:
Aber als ich versuchte, Safari zu benutzen, zeigte es die allererste Seite, aber nicht die zweite.
