Start · Sprachen · JavaScript · Referenz · PerformanceEventTiming.cancelable

PerformanceEventTiming.cancelable

Eigenschaft

Schreibgeschützter boolescher Wert, der die <code>cancelable</code>-Eigenschaft des gemessenen Ereignisses zurückgibt, also ob es mit <code>preventDefault()</code> abgebrochen werden konnte.

seit JavaScript Chrome/Edge 76+, Firefox 89+, Safari 26+ (nicht Ba Kategorie: webapi

Signatur

PerformanceEventTiming.cancelable

Beschreibung

Die Eigenschaft cancelable eines PerformanceEventTiming-Eintrags spiegelt den Wert von Event.cancelable des ursprünglichen Ereignisses wider, zu dem der Performance-Eintrag gehört. Sie ist true, wenn das Ereignis mit preventDefault() abgebrochen werden konnte, sonst false.

Nützlich ist das bei der Analyse der Reaktionsfähigkeit, etwa für Interaction to Next Paint (INP): Abbrechbare Ereignisse wie touchstart, wheel oder keydown zwingen den Browser, auf den Event-Handler zu warten, bevor er die Standardaktion ausführt (z. B. Scrollen). Lange Verarbeitungszeiten bei abbrechbaren Ereignissen blockieren daher oft direkt die Standardaktion. Mit dieser Eigenschaft kannst du langsame Ereignisse gezielt danach filtern.

Die Einträge bekommst du über einen PerformanceObserver mit dem Typ "event" (Ereignisse ab einer Mindestdauer) oder "first-input" (erste Nutzereingabe). Die Eigenschaft ist schreibgeschützt und nimmt keine Parameter an.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn das zugehörige Ereignis abbrechbar war, andernfalls false.

Beispiele

Abbrechbare Ereignisse mit PerformanceObserver protokollieren

const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    console.log(`${entry.name}: abbrechbar=${entry.cancelable}, Dauer=${entry.duration} ms`);
  }
});

// Ereignisse ab 16 ms Dauer erfassen (Minimum laut Spezifikation)
observer.observe({ type: "event", buffered: true, durationThreshold: 16 });
pointerdown: abbrechbar=true, Dauer=24 ms click: abbrechbar=true, Dauer=24 ms

Langsame, abbrechbare Ereignisse als Scroll-Bremse erkennen

const slowCancelable = [];

new PerformanceObserver((list) => {
  list.getEntries()
    .filter((entry) => entry.cancelable && entry.processingEnd - entry.processingStart > 50)
    .forEach((entry) => {
      slowCancelable.push({
        typ: entry.name,
        verarbeitung: Math.round(entry.processingEnd - entry.processingStart),
        ziel: entry.target?.nodeName ?? "unbekannt"
      });
      console.warn("Blockierender Handler:", slowCancelable.at(-1));
    });
}).observe({ type: "event", buffered: true, durationThreshold: 16 });
Blockierender Handler: { typ: 'keydown', verarbeitung: 87, ziel: 'INPUT' }

Erste Eingabe (first-input) prüfen

new PerformanceObserver((list) => {
  const [firstInput] = list.getEntries();
  const verzoegerung = firstInput.processingStart - firstInput.startTime;
  console.log({
    ereignis: firstInput.name,
    abbrechbar: firstInput.cancelable,
    eingabeVerzoegerung: Math.round(verzoegerung)
  });
}).observe({ type: "first-input", buffered: true });
{ ereignis: 'mousedown', abbrechbar: true, eingabeVerzoegerung: 12 }

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Die Event Timing API wird von Chromium-Browsern (ab Version 76) und Firefox (ab 89) unterstützt, in Safari erst seit Kurzem. Vorher prüfen, z. B. mit PerformanceObserver.supportedEntryTypes.includes("event").
  • Der Wert sagt nur, ob das Ereignis abbrechbar war, nicht ob preventDefault() tatsächlich aufgerufen wurde. Dafür gibt es in der Event Timing API keine Information.
  • Bei Listenern, die mit { passive: true } registriert wurden, kann das Ereignis trotzdem cancelable: true haben. Der Browser wartet dann aber nicht auf den Handler. cancelable allein beweist also noch nicht, dass die Standardaktion blockiert wurde.
  • Einträge vom Typ "event" werden erst ab einer Dauer von 104 ms (Standard) bzw. dem angegebenen durationThreshold (mindestens 16 ms) erzeugt. Schnelle Ereignisse tauchen deshalb nicht auf.
  • entry.target kann null sein, wenn der Knoten inzwischen aus dem DOM entfernt wurde.