Start · Sprachen · JavaScript · Referenz · Gamepad.timestamp

Gamepad.timestamp

Eigenschaft

Liefert einen <code>DOMHighResTimeStamp</code> mit dem Zeitpunkt, zu dem die Daten dieses Gamepads zuletzt aktualisiert wurden.

seit JavaScript Baseline: alle modernen Browser (Chrome 21+, Firef Kategorie: webapi

Signatur

Gamepad.timestamp

Beschreibung

Die schreibgeschützte Eigenschaft timestamp des Gamepad-Interfaces enthält einen DOMHighResTimeStamp in Millisekunden. Er gibt an, wann der Browser zuletzt neue Daten (Achsen- oder Tastenzustände) vom Gerät erhalten hat. Der Wert ist relativ zu performance.timeOrigin, lässt sich also direkt mit performance.now() vergleichen.

Am häufigsten braucht man die Eigenschaft in einer Spielschleife, die per requestAnimationFrame() läuft: Hat sich timestamp seit dem letzten Frame nicht verändert, liegen keine neuen Eingaben vor und man kann die Auswertung überspringen. Außerdem kann man mit ihr die Eingabelatenz messen oder erkennen, dass ein Controller schon länger keine Daten mehr schickt, etwa weil er in den Energiesparmodus gegangen ist.

Wichtig: In Chromium-Browsern ist ein Gamepad-Objekt eine Momentaufnahme. Den aktuellen Zeitstempel bekommt man deshalb nur, wenn man in jedem Frame navigator.getGamepads() neu aufruft. Ein im gamepadconnected-Event gespeichertes Objekt behält dort seinen alten Wert.

Rückgabewert

Typ
DOMHighResTimeStamp (number)
Beschreibung
Zeitpunkt der letzten Datenaktualisierung in Millisekunden, relativ zu performance.timeOrigin. Nur lesbar.

Beispiele

Zeitstempel beim Verbinden ausgeben

window.addEventListener('gamepadconnected', (event) => {
  const pad = event.gamepad;
  console.log(`${pad.id} verbunden, letzte Aktualisierung: ${pad.timestamp.toFixed(1)} ms`);
});
Xbox Wireless Controller (STANDARD GAMEPAD) verbunden, letzte Aktualisierung: 1523.4 ms

Nur bei neuen Daten auswerten (Spielschleife)

const lastTimestamps = new Map();

const loop = () => {
  for (const pad of navigator.getGamepads()) {
    if (!pad) continue;
    // Keine neuen Daten seit dem letzten Frame, also überspringen
    if (lastTimestamps.get(pad.index) === pad.timestamp) continue;
    lastTimestamps.set(pad.index, pad.timestamp);

    const [x, y] = pad.axes;
    console.log(`Pad ${pad.index}: x=${x.toFixed(2)}, y=${y.toFixed(2)}`);
  }
  requestAnimationFrame(loop);
};

requestAnimationFrame(loop);
Pad 0: x=0.12, y=-0.87

Inaktive Controller erkennen

const IDLE_MS = 30_000;

const checkIdle = () => {
  const now = performance.now();
  for (const pad of navigator.getGamepads()) {
    if (pad && now - pad.timestamp > IDLE_MS) {
      console.warn(`Controller ${pad.index} ist seit über 30 s inaktiv.`);
    }
  }
};

setInterval(checkIdle, 5_000);
Controller 0 ist seit über 30 s inaktiv.

// Wichtig · Fallstricke

  • Momentaufnahme oder Live-Objekt: In Chrome und Edge ändert sich timestamp nur in einem neu geholten Objekt aus navigator.getGamepads(). In Firefox wird das Objekt teilweise live aktualisiert. Wer in jedem Frame neu abfragt, bekommt in allen Browsern das gleiche Verhalten.
  • Nicht jede Änderung zählt als Eingabe: Manche Browser und Treiber erhöhen den Zeitstempel auch bei Sensorrauschen oder regelmäßigen Abfragen, obwohl der Nutzer nichts gedrückt hat. Ein neuer Wert bedeutet also nicht zwingend eine echte Eingabe. Für eine robuste Erkennung zusätzlich Achsen und Tasten vergleichen.
  • Genauigkeit: Wie alle DOMHighResTimeStamp-Werte kann der Browser auch diesen zum Schutz vor Fingerprinting und Timing-Angriffen vergröbern.
  • Sicherer Kontext: Die Gamepad API steht in aktuellen Browsern nur über HTTPS zur Verfügung und kann per Permissions-Policy gamepad gesperrt sein.
  • Ältere Firefox-Versionen hatten Implementierungen, die nicht der Spezifikation entsprachen. Ein Zeitstempel von 0 kann bedeuten, dass noch keine Daten eingetroffen sind.