Start · Sprachen · JavaScript · Referenz · VRDisplayEvent.reason

VRDisplayEvent.reason

Eigenschaft

Schreibgeschützte Eigenschaft, die als Zeichenkette angibt, warum ein <code>VRDisplayEvent</code> ausgelöst wurde, z. B. <code>"mounted"</code> oder <code>"navigation"</code>.

seit JavaScript WebVR 1.1 (veraltet, nicht standardisiert; nur ält deprecated seit ja Kategorie: webapi

Signatur

VRDisplayEvent.reason

Beschreibung

Die Eigenschaft reason des VRDisplayEvent-Interfaces gibt an, warum ein WebVR-Ereignis ausgelöst wurde. Das ist vor allem bei Ereignissen wie vrdisplayactivate, vrdisplaydeactivate oder vrdisplaypresentchange nützlich. Die Anwendung kann damit unterscheiden, ob der Nutzer das Headset aufgesetzt hat oder ob eine Seitennavigation innerhalb von VR stattfand.

Der Wert gehört zur Aufzählung VRDisplayEventReason und ist eine dieser Zeichenketten:

  • "mounted": Das Headset wurde aufgesetzt und das Display ist bereit.
  • "navigation": Die Seite wurde von einer anderen Seite aus aufgerufen, die bereits im VR-Modus lief. Die neue Seite sollte die Darstellung dann sofort mit VRDisplay.requestPresent() fortsetzen.
  • "requested": Der Nutzer hat die Darstellung über die Oberfläche des Browsers oder des Geräts angefordert, z. B. über einen Knopf.
  • "unmounted": Das Headset wurde abgesetzt.

Gibt es keinen bestimmten Grund, ist der Wert null bzw. undefined. Die Eigenschaft ist schreibgeschützt. Beim Erzeugen eines Ereignisses mit new VRDisplayEvent(type, init) kann sie aber über init.reason gesetzt werden.

Rückgabewert

Typ
"mounted" | "navigation" | "requested" | "unmounted" | null
Beschreibung
Ein Wert aus VRDisplayEventReason, der den Auslöser beschreibt, oder null, wenn es keinen bestimmten Grund gibt.

Beispiele

VR-Darstellung nach Navigation automatisch fortsetzen

const canvas = document.querySelector('#vr-canvas');

window.addEventListener('vrdisplayactivate', async (event) => {
  // Nur bei Navigation aus einer VR-Seite oder beim Aufsetzen sofort starten
  if (event.reason === 'navigation' || event.reason === 'mounted') {
    try {
      await event.display.requestPresent([{ source: canvas }]);
      console.log(`Präsentation gestartet (Grund: ${event.reason})`);
    } catch (err) {
      console.error('requestPresent fehlgeschlagen:', err);
    }
  }
});
Präsentation gestartet (Grund: navigation)

Pausieren beim Absetzen des Headsets (on-Property)

let paused = false;

window.onvrdisplaydeactivate = (event) => {
  if (event.reason === 'unmounted') {
    paused = true;
    console.log('Headset abgesetzt – Spiel pausiert');
  }
};

window.onvrdisplayactivate = (event) => {
  if (event.reason === 'mounted' && paused) {
    paused = false;
    console.log('Headset aufgesetzt – Spiel läuft weiter');
  }
};
Headset abgesetzt – Spiel pausiert

Feature-Erkennung und synthetisches Ereignis

if ('VRDisplayEvent' in window && navigator.getVRDisplays) {
  const [display] = await navigator.getVRDisplays();
  if (display) {
    const evt = new VRDisplayEvent('vrdisplayactivate', {
      display,
      reason: 'requested'
    });
    console.log(evt.reason);
  }
} else {
  console.log('WebVR nicht verfügbar – WebXR verwenden');
}
requested // bzw. in modernen Browsern: WebVR nicht verfügbar – WebXR verwenden

// Wichtig · Fallstricke

Veraltet: Die WebVR-API und damit auch VRDisplayEvent.reason wurden nie standardisiert und durch die WebXR Device API ersetzt. Aktuelle Versionen von Chrome, Edge und Firefox unterstützen WebVR nicht mehr. Für neue Projekte solltest du XRSession und die zugehörigen Ereignisse wie visibilitychange und end verwenden.

  • Prüfe die Unterstützung immer vorher, z. B. mit 'VRDisplayEvent' in window.
  • Rechne damit, dass reason null oder undefined ist, etwa bei vrdisplayconnect oder vrdisplaydisconnect. Behandle den Wert nicht als garantiert vorhanden.
  • requestPresent() braucht normalerweise eine Nutzeraktion. Innerhalb eines vrdisplayactivate-Handlers mit dem Grund "navigation" oder "mounted" erlauben Browser den Aufruf aber auch ohne Klick.
  • Es gibt nur vier Werte, der Wert ist also nicht wirklich „menschenlesbar“. Zeige ihn Nutzern nicht direkt an, sondern übersetze ihn vorher.