Signatur
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
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`);
});
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);
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);
// Wichtig · Fallstricke
- Momentaufnahme oder Live-Objekt: In Chrome und Edge ändert sich
timestampnur in einem neu geholten Objekt ausnavigator.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
gamepadgesperrt sein. - Ältere Firefox-Versionen hatten Implementierungen, die nicht der Spezifikation entsprachen. Ein Zeitstempel von
0kann bedeuten, dass noch keine Daten eingetroffen sind.