Start · Sprachen · JavaScript · Referenz · Performance.eventCounts

Performance.eventCounts

Eigenschaft

Schreibgeschützte <code>EventCounts</code>-Map, die pro Ereignistyp zählt, wie oft das Ereignis seit dem Laden der Seite ausgelöst wurde.

seit JavaScript Chrome/Edge 85+, Firefox 89+; nicht in Safari (Sta Kategorie: webapi

Signatur

get Performance.eventCounts

Beschreibung

performance.eventCounts gehört zur Event Timing API und liefert ein EventCounts-Objekt. Es verhält sich wie eine schreibgeschützte Map: Die Schlüssel sind Ereignistypen wie "click", "keydown" oder "pointerdown", die Werte sind die Anzahl der Auslösungen seit dem Laden des Dokuments.

Nützlich ist die Eigenschaft vor allem für Performance-Monitoring und Real User Monitoring (RUM). Die Event Timing API meldet über PerformanceObserver nur Ereignisse, deren Dauer eine Schwelle überschreitet (standardmäßig 104 ms). Mit eventCounts erfahren Sie die Gesamtzahl der Interaktionen und können so Anteile berechnen, etwa: „Wie viel Prozent aller Klicks waren langsam?“

Gezählt werden nur Ereignistypen, die die Event Timing API unterstützt. Dazu gehören vor allem Maus-, Pointer-, Touch-, Tastatur-, Eingabe-, Kompositions- und Drag-and-Drop-Ereignisse (z. B. click, dblclick, mousedown, pointerup, touchstart, keydown, input, beforeinput, drop). Ereignisse wie scroll, resize oder load tauchen nicht auf.

Das Objekt hat die üblichen lesenden Map-Methoden: get(), has(), size, keys(), values(), entries(), forEach() und [Symbol.iterator]. Schreibende Methoden wie set(), delete() oder clear() gibt es nicht.

Rückgabewert

Typ
EventCounts
Beschreibung
Eine schreibgeschützte, Map-ähnliche Sammlung mit Einträgen der Form [ereignistyp: string, anzahl: number]. Es ist immer dieselbe, laufend aktualisierte Instanz.

Beispiele

Anzahl bestimmter Ereignisse abfragen

// Wie oft wurde bisher geklickt bzw. eine Taste gedrückt?
const counts = performance.eventCounts;
console.log(`Klicks: ${counts.get('click') ?? 0}`);
console.log(`Tastendrücke: ${counts.get('keydown') ?? 0}`);
console.log(`Erfasste Typen: ${counts.size}`);
Klicks: 3 Tastendrücke: 12 Erfasste Typen: 36

Alle Ereignisse mit Zählerstand > 0 auflisten

const nonZero = [...performance.eventCounts]
  .filter(([, count]) => count > 0)
  .sort((a, b) => b[1] - a[1]);

console.table(Object.fromEntries(nonZero));
┌─────────────┬────────┐ │ pointermove │ … │ │ pointerdown │ 4 │ │ click │ 3 │ └─────────────┴────────┘

Anteil langsamer Klicks berechnen (RUM)

let slowClicks = 0;

// Event Timing meldet nur Ereignisse ab durationThreshold (min. 16 ms)
const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (entry.name === 'click' && entry.duration > 100) slowClicks++;
  }
});
observer.observe({ type: 'event', durationThreshold: 16, buffered: true });

// Beim Verlassen der Seite auswerten und senden
document.addEventListener('visibilitychange', () => {
  if (document.visibilityState !== 'hidden') return;
  const totalClicks = performance.eventCounts.get('click') ?? 0;
  const ratio = totalClicks ? slowClicks / totalClicks : 0;
  navigator.sendBeacon('/rum', JSON.stringify({ totalClicks, slowClicks, ratio }));
});

Funktionsprüfung vor der Nutzung

const getEventCount = (type) =>
  'eventCounts' in performance ? performance.eventCounts.get(type) ?? 0 : null;

console.log(getEventCount('pointerdown'));
4 // bzw. null in Browsern ohne Unterstützung

// Wichtig · Fallstricke

  • Browser-Unterstützung: Nur in Chromium-Browsern (ab Version 85) und Firefox (ab 89). Safari unterstützt die Eigenschaft (Stand 2024) nicht, dort ist sie undefined. Deshalb immer mit 'eventCounts' in performance prüfen.
  • Nicht jeder Ereignistyp wird gezählt, nur die von der Event Timing API erfassten. get('scroll') liefert undefined, nicht 0.
  • Gezählt werden die Ereignisse, die der Browser ausliefert, unabhängig davon, ob ein Listener registriert ist. Mit dispatchEvent() ausgelöste, synthetische Ereignisse zählen nicht mit.
  • Die Zähler gelten pro Dokument und lassen sich nicht zurücksetzen. Für Zeitfenster merken Sie sich einen Zwischenstand und bilden die Differenz. Bei Seiten aus dem Back/Forward-Cache laufen die Zähler weiter.
  • Die Eigenschaft gibt es nur im Fensterkontext, nicht in Web Workers.
  • Zu Datenschutz und Performance: Das Auslesen kostet praktisch nichts. Die Werte zeigen aber das Interaktionsverhalten der Nutzer und sollten nur zusammengefasst an Analysedienste gesendet werden.