Signatur
Beschreibung
Die Eigenschaft interval eines DeviceMotionEvent gibt an, wie viele Millisekunden zwischen zwei Messungen des Beschleunigungs- und Gyroskopsensors liegen. Der Wert ist eine Gleitkommazahl (double) und bleibt bei einem Gerät meistens gleich, zum Beispiel etwa 16 (rund 60 Hz) oder 100 (10 Hz).
Gebraucht wird der Wert vor allem bei numerischen Berechnungen über die Zeit: Wenn Sie die Beschleunigung (acceleration) aufaddieren, um eine Geschwindigkeit abzuschätzen, oder die Drehrate (rotationRate, in Grad pro Sekunde) aufaddieren, um einen Drehwinkel zu berechnen, brauchen Sie den Zeitschritt Δt. Genau diesen Zeitschritt liefert interval, umgerechnet in Sekunden (interval / 1000).
Außerdem können Sie mit dem Wert die Rechenlast in Ihrem Event-Handler planen. Bei einem kleinen Intervall wird der Handler sehr oft aufgerufen. Aufwendige DOM-Änderungen sollten Sie dann bündeln, etwa mit requestAnimationFrame().
Die Eigenschaft kann nur gelesen werden. Die Abtastrate lässt sich darüber nicht einstellen, denn sie wird vom Browser und von der Hardware vorgegeben.
Rückgabewert
0.Beispiele
Abtastrate des Geräts ermitteln
const onMotion = (event) => {
const ms = event.interval;
const hz = ms > 0 ? (1000 / ms).toFixed(1) : 'unbekannt';
console.log(`Intervall: ${ms} ms (≈ ${hz} Hz)`);
// Einmal reicht – danach den Listener entfernen
window.removeEventListener('devicemotion', onMotion);
};
window.addEventListener('devicemotion', onMotion);
Drehwinkel aus der Drehrate aufaddieren
let angleAlpha = 0; // Drehung um die z-Achse in Grad
window.addEventListener('devicemotion', (event) => {
const rate = event.rotationRate;
if (!rate || rate.alpha == null) return;
const dt = event.interval / 1000; // ms → s
angleAlpha = (angleAlpha + rate.alpha * dt) % 360;
document.querySelector('#angle').textContent = `${angleAlpha.toFixed(1)}°`;
});
Berechtigung unter iOS anfragen und dann auswerten
const startMotion = async () => {
// Safari auf iOS 13+ verlangt eine ausdrückliche Erlaubnis
if (typeof DeviceMotionEvent?.requestPermission === 'function') {
const state = await DeviceMotionEvent.requestPermission();
if (state !== 'granted') {
console.warn('Bewegungssensoren abgelehnt');
return;
}
}
window.ondevicemotion = (event) => {
console.log('Neue Messung alle', event.interval, 'ms');
window.ondevicemotion = null; // Handler wieder abmelden
};
};
// requestPermission darf nur nach einer Nutzeraktion aufgerufen werden
document.querySelector('#start').addEventListener('click', startMotion);
Selbst erzeugtes Event (z. B. für Tests)
const fake = new DeviceMotionEvent('devicemotion', {
acceleration: { x: 0, y: 0, z: 9.81 },
interval: 20
});
console.log(fake.interval);
console.log(new DeviceMotionEvent('devicemotion').interval);
// Wichtig · Fallstricke
- Einheit: Der Wert wird in Millisekunden angegeben,
rotationRatedagegen in Grad pro Sekunde. Rechnen Sie ihn deshalb vor dem Multiplizieren mit/ 1000in Sekunden um. Die Umrechnung zu vergessen, ist ein häufiger Fehler. - Nominalwert, nicht gemessen:
intervalgibt die vorgesehene Rate an. Die tatsächlichen Abstände zwischen den Events können schwanken, zum Beispiel wenn das System stark ausgelastet ist oder der Tab im Hintergrund läuft. Für genaue Berechnungen messen Sie den Abstand zusätzlich überevent.timeStampoderperformance.now(). - Einheit bei alten Browsern: Ältere Chrome-Versionen haben den Wert zeitweise in Sekunden statt in Millisekunden geliefert. Ein Wert unter
1weist auf dieses alte Verhalten hin. - Sicherheit und Datenschutz: Das Event wird nur in sicheren Kontexten (HTTPS) ausgelöst. Es kann außerdem durch eine Permissions Policy (
accelerometer,gyroscope) gesperrt sein. Unter iOS istDeviceMotionEvent.requestPermission()nach einer Nutzeraktion nötig. In iframes kann das Event blockiert sein. - Desktop-Geräte ohne Sensoren lösen das Event oft gar nicht aus. Manche lösen es einmal aus, mit Sensordaten gleich
null.