Start · Sprachen · JavaScript · Referenz · PointerEvent.getPredictedEvents()

PointerEvent.getPredictedEvents()

Methode

Gibt ein Array von <code>PointerEvent</code>-Objekten mit vom Browser geschätzten zukünftigen Zeigerpositionen zurück, um die gefühlte Eingabelatenz zu verringern.

seit JavaScript Chrome/Edge 77+, Firefox 89+, Safari 18+ (nur in s Kategorie: webapi

Signatur

PointerEvent.prototype.getPredictedEvents()

Beschreibung

getPredictedEvents() liefert eine Liste synthetischer PointerEvent-Instanzen, die der Browser (bzw. das Betriebssystem) aus der bisherigen Bewegung des Zeigers hochrechnet. Sie beschreiben, wo sich Maus, Stift oder Finger in den nächsten Millisekunden vermutlich befinden werden.

Der typische Einsatzzweck sind Zeichen- und Handschrift-Anwendungen sowie Spiele: Zwischen der physischen Bewegung und dem nächsten Frame vergeht immer etwas Zeit, sodass der gezeichnete Strich dem Stift „hinterherläuft“. Wenn man zusätzlich die vorhergesagten Punkte als vorläufiges Segment zeichnet, wirkt die Eingabe spürbar direkter. Im nächsten pointermove ersetzt man diese Vorhersage durch die echten Daten.

Sinnvoll sind die Vorhersagen nur bei pointermove-Ereignissen (bzw. pointerrawupdate). Bei anderen Ereignistypen oder wenn der Browser keine Vorhersage berechnen kann, ist das Array leer. Die Methode wird häufig zusammen mit getCoalescedEvents() genutzt: Die zusammengefassten Ereignisse beschreiben die Vergangenheit in hoher Auflösung, die vorhergesagten die nahe Zukunft.

Rückgabewert

Typ
PointerEvent[]
Beschreibung
Ein Array von PointerEvent-Objekten mit geschätzten Positionen (clientX, clientY, pressure usw.), zeitlich aufsteigend sortiert. Kann leer sein; ist bei nicht vertrauenswürdigen (synthetischen) Ereignissen in der Regel leer.

Beispiele

Vorhergesagte Positionen protokollieren

const area = document.querySelector('#area');

area.addEventListener('pointermove', (event) => {
  const predicted = event.getPredictedEvents?.() ?? [];
  console.log(`Aktuell: ${event.clientX}/${event.clientY}`);
  for (const p of predicted) {
    console.log(`  Vorhersage: ${p.clientX}/${p.clientY}`);
  }
});
Aktuell: 120/85 Vorhersage: 124/87 Vorhersage: 128/90

Latenzarmes Zeichnen auf einem Canvas

const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
const stroke = []; // echte Punkte
let drawing = false;

const render = (predicted = []) => {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  const points = [...stroke, ...predicted];
  if (points.length < 2) return;
  ctx.beginPath();
  ctx.moveTo(points[0].x, points[0].y);
  points.slice(1).forEach(({ x, y }) => ctx.lineTo(x, y));
  ctx.stroke();
};

const toPoint = (e) => {
  const r = canvas.getBoundingClientRect();
  return { x: e.clientX - r.left, y: e.clientY - r.top };
};

canvas.addEventListener('pointerdown', (e) => {
  drawing = true;
  stroke.length = 0;
  stroke.push(toPoint(e));
  canvas.setPointerCapture(e.pointerId);
});

canvas.addEventListener('pointermove', (e) => {
  if (!drawing) return;
  // Vergangenheit in voller Auflösung übernehmen
  const coalesced = e.getCoalescedEvents?.() ?? [e];
  coalesced.forEach((c) => stroke.push(toPoint(c)));
  // Zukunft nur vorläufig zeichnen, nicht speichern
  const predicted = (e.getPredictedEvents?.() ?? []).map(toPoint);
  render(predicted);
});

canvas.addEventListener('pointerup', () => {
  drawing = false;
  render(); // endgültiger Strich ohne Vorhersage
});

Feature-Erkennung

const supportsPrediction =
  'PointerEvent' in window &&
  typeof PointerEvent.prototype.getPredictedEvents === 'function';

console.log(supportsPrediction ? 'Vorhersage verfügbar' : 'Keine Vorhersage');
Vorhersage verfügbar

// Wichtig · Fallstricke

  • Nur Schätzungen: Vorhergesagte Punkte dürfen niemals dauerhaft gespeichert werden. Man zeichnet sie nur vorläufig und verwirft sie beim nächsten Ereignis, sonst entstehen „Überschwinger“ bei abrupten Richtungswechseln.
  • Leeres Array ist normal: Bei pointerdown, pointerup, per new PointerEvent() erzeugten Ereignissen oder fehlender Plattformunterstützung gibt es keine Vorhersage. Code muss damit umgehen können.
  • Kompatibilität: Unterstützt in Chromium-Browsern (ab 77), Firefox (ab 89) und Safari (ab 18). Nur in sicheren Kontexten (HTTPS) verfügbar. In älteren Browsern fehlt die Methode ganz – per optionalem Aufruf event.getPredictedEvents?.() absichern.
  • Die Qualität und Anzahl der Vorhersagen hängt stark von Gerät, Eingabemittel und Betriebssystem ab; bei Mauseingaben sind sie oft weniger nützlich als bei Stift oder Touch.
  • Für flüssiges Zeichnen zusätzlich touch-action: none auf der Zeichenfläche setzen, damit der Browser nicht scrollt oder zoomt.