Signatur
Beschreibung
Die Eigenschaft ready der Schnittstelle FontFaceSet, meist über document.fonts.ready aufgerufen, gibt ein Promise zurück. Es wird erfüllt, wenn alle Ladevorgänge für Schriften abgeschlossen sind, das Layout fertig ist und keine weiteren Schriften mehr geladen werden müssen. Der Erfüllungswert ist das FontFaceSet selbst.
Typische Anwendungsfälle:
- Textmaße messen, zum Beispiel mit
getBoundingClientRect()oderCanvasRenderingContext2D.measureText(). Erst wenn die Webfonts wirklich aktiv sind, stimmen die Werte. - Text in ein
<canvas>zeichnen, und zwar mit der richtigen Schrift statt einer Ersatzschrift. - Einen „Flash of Unstyled Text“ vermeiden: Eine CSS-Klasse wird erst gesetzt, wenn die Schriften bereitstehen.
- Layout-Bibliotheken (Masonry, Textfluss, Silbentrennung) erst nach dem Laden der Schriften starten.
Das Promise wird nur einmal pro Ladezyklus erfüllt. Starten später neue Ladevorgänge, etwa weil dynamisch Text mit einer anderen Schrift eingefügt wird, geht FontFaceSet.status wieder auf "loading". Ein erneuter Zugriff auf ready kann dann ein neues, noch offenes Promise liefern. Möchte man kontinuierlich reagieren, eignen sich die Ereignisse loadingdone und loadingerror besser.
Rückgabewert
Promise, das mit dem jeweiligen FontFaceSet (z. B. document.fonts) erfüllt wird, sobald Laden und Layout abgeschlossen sind. Es wird auch dann erfüllt, wenn einzelne Schriften nicht geladen werden konnten. Fehler meldet das loadingerror-Ereignis.Beispiele
Warten, bis alle Schriften geladen sind
const waitForFonts = async () => {
const fontSet = await document.fonts.ready;
console.log(`Status: ${fontSet.status}, Anzahl Schriften: ${fontSet.size}`);
document.documentElement.classList.add('fonts-loaded');
};
waitForFonts();
Text mit Webfont ins Canvas zeichnen
const canvas = document.querySelector('#chart');
const ctx = canvas.getContext('2d');
// Ohne Warten würde möglicherweise die Ersatzschrift gezeichnet
await document.fonts.load('bold 24px "Inter"');
await document.fonts.ready;
ctx.font = 'bold 24px "Inter"';
ctx.fillText('Umsatz 2024', 20, 40);
console.log('Breite:', Math.round(ctx.measureText('Umsatz 2024').width), 'px');
Textbreite erst nach dem Laden der Schriften messen
const heading = document.querySelector('h1');
console.log('Vorher:', heading.getBoundingClientRect().width);
document.fonts.ready.then(() => {
// Jetzt ist das Layout mit der endgültigen Schrift berechnet
console.log('Nachher:', heading.getBoundingClientRect().width);
});
Mit Zeitlimit kombinieren
const fontsReadyOrTimeout = (ms = 3000) =>
Promise.race([
document.fonts.ready.then(() => 'fonts'),
new Promise((resolve) => setTimeout(() => resolve('timeout'), ms))
]);
const result = await fontsReadyOrTimeout(2000);
console.log(`Rendering gestartet nach: ${result}`);
// Wichtig · Fallstricke
- Kein Fehlerfall: Das Promise wird auch erfüllt, wenn eine Schrift nicht geladen werden kann, etwa bei einem 404-Fehler oder einem CORS-Problem. Ob eine bestimmte Schrift verfügbar ist, prüft man mit
document.fonts.check('16px "Inter"')oder über das Ereignisloadingerror. - Nur benutzte Schriften werden geladen: Per
@font-facedeklarierte Schriften lädt der Browser erst, wenn sie tatsächlich im Dokument verwendet werden. Kommt eine Schrift nur im Canvas zum Einsatz, muss man sie vorher mitdocument.fonts.load()anstoßen. Sonst istreadywomöglich schon erfüllt, ohne dass die Schrift geladen wurde. - Nicht dauerhaft gültig: Werden später neue Schriften nachgeladen, kann ein erneuter Zugriff auf
readyein neues Promise liefern. Deshalb sollte manreadynicht einmalig zwischenspeichern und dann für „alle Zukunft“ verwenden. - Kompatibilität: Wird von allen modernen Browsern unterstützt (Chrome 35+, Firefox 41+, Safari 10+, Edge 79+), nicht vom Internet Explorer. In Web Workern ist die Eigenschaft über
self.fontserreichbar, sofern der Browser das unterstützt. Eine Prüfung wie'fonts' in documentdient als Feature-Erkennung. - Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird ignoriert und löst im Strict Mode einen
TypeErroraus.