Start · Sprachen · JavaScript · Referenz · DeviceOrientationEvent.absolute

DeviceOrientationEvent.absolute

Eigenschaft

Schreibgeschützter Wahrheitswert, der angibt, ob die Orientierungsdaten eines <code>DeviceOrientationEvent</code> absolut (bezogen auf das Erdkoordinatensystem) oder relativ sind.

seit JavaScript Baseline: Chrome, Edge, Firefox, Safari (iOS: meis Kategorie: webapi

Signatur

DeviceOrientationEvent.absolute

Beschreibung

Die Eigenschaft absolute des DeviceOrientationEvent-Interfaces zeigt an, auf welches Bezugssystem sich die Winkel alpha, beta und gamma beziehen. Bei true beziehen sie sich auf das Erdkoordinatensystem: alpha ist dann relativ zum magnetischen Nordpol, die anderen Achsen zur Schwerkraft. Bei false beziehen sich die Werte auf einen beliebigen, vom Gerät gewählten Ausgangszustand, oft die Ausrichtung beim Start der Messung.

Wichtig ist das vor allem für Kompass-Anwendungen, Karten mit „Blickrichtung“, Augmented Reality und Sternkarten. Dort braucht man eine echte Himmelsrichtung. Für Spiele oder Neigungssteuerung reichen relative Daten meistens aus, weil dort nur Änderungen zählen.

Browser können zwei Ereignisse auslösen: deviceorientation (in Chromium relativ, also absolute === false) und deviceorientationabsolute (immer absolut, sofern ein Magnetometer vorhanden ist). Frag deshalb vor jeder Kompass-Berechnung event.absolute ab, statt dich auf den Ereignistyp zu verlassen.

Beispiele

Absolut oder relativ? Einfache Prüfung

window.addEventListener('deviceorientation', (event) => {
  const modus = event.absolute ? 'absolut (Erdbezug)' : 'relativ (Gerätebezug)';
  console.log(`Orientierung ${modus}: alpha=${event.alpha?.toFixed(1)}°`);
}, { once: true });
Orientierung relativ (Gerätebezug): alpha=12.3°

Kompass mit Fallback auf deviceorientationabsolute und iOS

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

const aktualisiereKompass = (event) => {
  let richtung = null;
  if (typeof event.webkitCompassHeading === 'number') {
    // iOS Safari: eigene Kompass-Eigenschaft, bereits im Uhrzeigersinn
    richtung = event.webkitCompassHeading;
  } else if (event.absolute && event.alpha !== null) {
    // alpha läuft gegen den Uhrzeigersinn -> umrechnen
    richtung = (360 - event.alpha) % 360;
  }
  if (richtung === null) return; // relative Daten taugen nicht als Kompass
  nadel.style.transform = `rotate(${-richtung}deg)`;
};

const ereignis = 'ondeviceorientationabsolute' in window
  ? 'deviceorientationabsolute'
  : 'deviceorientation';
window.addEventListener(ereignis, aktualisiereKompass);

Berechtigung auf iOS anfordern und absolute-Status melden

const starte = async () => {
  if (typeof DeviceOrientationEvent.requestPermission === 'function') {
    const status = await DeviceOrientationEvent.requestPermission();
    if (status !== 'granted') {
      console.warn('Zugriff auf Sensoren verweigert');
      return;
    }
  }
  window.addEventListener('deviceorientation', (e) => {
    console.log('absolute:', e.absolute);
  }, { once: true });
};

// Muss durch eine Nutzeraktion ausgelöst werden
document.querySelector('#start').addEventListener('click', starte);
absolute: false

Synthetisches Ereignis für Tests

const testEvent = new DeviceOrientationEvent('deviceorientation', {
  alpha: 90, beta: 0, gamma: 0, absolute: true
});
window.addEventListener('deviceorientation', (e) => console.log(e.absolute, e.alpha));
window.dispatchEvent(testEvent);
true 90

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung an event.absolute wird ignoriert. Nur beim Konstruktor new DeviceOrientationEvent(type, { absolute }) lässt sich der Wert festlegen (Standard: false).
  • Chromium: Seit Chrome 50 liefert deviceorientation relative Daten. Für absolute Werte gibt es das Ereignis deviceorientationabsolute.
  • iOS Safari: absolute ist in der Regel false. Die Kompassrichtung steckt stattdessen in der nicht standardisierten Eigenschaft webkitCompassHeading. Seit iOS 13 muss außerdem DeviceOrientationEvent.requestPermission() nach einer Nutzeraktion aufgerufen werden.
  • Sicherer Kontext: Sensor-Ereignisse gibt es nur über HTTPS. In iframes kann eine Permissions-Policy (accelerometer, gyroscope, magnetometer) den Zugriff sperren.
  • Auch bei absolute === true bezieht sich alpha auf den magnetischen Nordpol, nicht auf den geografischen. Die Werte können durch Metall oder Magnetfelder in der Nähe gestört sein.
  • Geräte ohne Sensoren liefern oft ein einzelnes Ereignis, bei dem alle Winkel null sind. Prüfe die Winkel deshalb immer auf null.