Start · Sprachen · JavaScript · Referenz · LayoutShift.toJSON()

LayoutShift.toJSON()

Methode

Gibt ein einfaches Objekt mit allen Eigenschaften eines <code>LayoutShift</code>-Eintrags zurück, das sich mit <code>JSON.stringify()</code> serialisieren lässt.

seit JavaScript Chromium-Browser (Chrome/Edge 77+, Opera); nicht i Kategorie: webapi

Signatur

LayoutShift.prototype.toJSON()

Beschreibung

LayoutShift.toJSON() ist ein Serialisierer. Die Methode wandelt einen LayoutShift-Performance-Eintrag in ein gewöhnliches JavaScript-Objekt um. Enthalten sind die geerbten Felder von PerformanceEntry (name, entryType, startTime, duration) sowie die spezifischen Felder value, hadRecentInput, lastInputTime und sources.

Meistens ruft man die Methode nicht selbst auf. JSON.stringify() nutzt sie automatisch, sobald ein LayoutShift-Objekt serialisiert wird. Praktisch ist das, wenn man Layout-Verschiebungen protokollieren oder für die Berechnung des Cumulative Layout Shift (CLS) per navigator.sendBeacon() an einen Analyse-Server schicken will.

Wichtig: Das Feld sources enthält LayoutShiftAttribution-Objekte. Deren node-Eigenschaft ist ein DOM-Knoten und lässt sich nicht sinnvoll serialisieren. In der JSON-Ausgabe fehlt der Knoten daher bzw. erscheint als leeres Objekt. Wer wissen will, welches Element sich verschoben hat, muss selbst einen Selektor oder Bezeichner daraus ableiten.

Rückgabewert

Typ
Object
Beschreibung
Ein einfaches Objekt mit den Eigenschaften name, entryType, startTime, duration, value, hadRecentInput, lastInputTime und sources des LayoutShift-Eintrags.

Beispiele

Layout-Verschiebungen als JSON protokollieren

const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    // Explizit aufgerufen: liefert ein einfaches Objekt
    console.log(entry.toJSON());
  }
});

observer.observe({ type: 'layout-shift', buffered: true });
{ name: '', entryType: 'layout-shift', startTime: 1234.5, duration: 0, value: 0.042, hadRecentInput: false, lastInputTime: 0, sources: [...] }

Implizite Nutzung durch JSON.stringify()

const observer = new PerformanceObserver((list) => {
  const entries = list.getEntries();
  // JSON.stringify ruft toJSON() automatisch auf
  console.log(JSON.stringify(entries, null, 2));
});

observer.observe({ type: 'layout-shift', buffered: true });
[ { "name": "", "entryType": "layout-shift", "startTime": 1234.5, "duration": 0, "value": 0.042, "hadRecentInput": false, ... } ]

CLS-Daten mit lesbaren Quellen an den Server senden

const shifts = [];

// Aus einem DOM-Knoten einen einfachen Selektor bauen
const describeNode = (node) => {
  if (!node || node.nodeType !== Node.ELEMENT_NODE) return null;
  return node.id ? `#${node.id}` : node.tagName.toLowerCase();
};

new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (entry.hadRecentInput) continue; // Verschiebungen nach Nutzereingaben ignorieren
    const data = entry.toJSON();
    data.sources = entry.sources.map((s) => ({
      element: describeNode(s.node),
      previousRect: s.previousRect.toJSON(),
      currentRect: s.currentRect.toJSON()
    }));
    shifts.push(data);
  }
}).observe({ type: 'layout-shift', buffered: true });

document.addEventListener('visibilitychange', () => {
  if (document.visibilityState === 'hidden' && shifts.length) {
    navigator.sendBeacon('/analytics/cls', JSON.stringify(shifts));
  }
});

// Wichtig · Fallstricke

  • Kompatibilität: Die Layout Instability API (und damit LayoutShift) gibt es nur in Chromium-basierten Browsern. Firefox und Safari unterstützen sie nicht. Vorher prüfen, z. B. mit PerformanceObserver.supportedEntryTypes.includes('layout-shift').
  • DOM-Knoten gehen verloren: sources[i].node übersteht die Serialisierung nicht sinnvoll. Wer die betroffenen Elemente braucht, muss sie vorher selbst in Selektoren oder Bezeichner umwandeln.
  • Das Ergebnis ist eine Momentaufnahme als einfaches Objekt. Es ist kein LayoutShift-Objekt mehr und hat dessen Prototyp-Methoden nicht.
  • Einträge mit hadRecentInput === true zählen nicht zum CLS-Wert und sollten vor dem Senden meist herausgefiltert werden.
  • name ist bei LayoutShift-Einträgen immer ein leerer String und duration immer 0.