Signatur
Beschreibung
Mit dem Konstruktor new VRDisplayEvent() erzeugen Sie ein Ereignisobjekt der WebVR-API. Der Browser löst solche Ereignisse normalerweise selbst aus, etwa vrdisplayconnect, vrdisplaydisconnect, vrdisplayactivate, vrdisplaydeactivate oder vrdisplaypresentchange. Dafür reagiert er auf den Zustand eines Headsets, zum Beispiel wenn es angeschlossen oder aufgesetzt wird oder wenn die Darstellung wechselt.
Den Konstruktor selbst brauchen Sie vor allem in Tests und Polyfills: Sie erzeugen ein synthetisches Ereignis mit einem bestimmten VRDisplay und einem Grund (reason) und lösen es dann mit dispatchEvent() auf window aus. So prüfen Sie Ihre Ereignis-Handler ohne echte Hardware.
Das erzeugte Objekt erbt von Event und hat zusätzlich die schreibgeschützten Eigenschaften display (das betroffene VRDisplay) und reason (warum das Ereignis ausgelöst wurde).
Wichtig: WebVR ist veraltet und wurde durch die WebXR Device API ersetzt. Für neue Projekte sollten Sie navigator.xr und XRSession-Ereignisse verwenden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Ereignisses, z. B. "vrdisplayconnect", "vrdisplaydisconnect", "vrdisplayactivate", "vrdisplaydeactivate", "vrdisplayblur", "vrdisplayfocus" oder "vrdisplaypresentchange". |
|
| $eventInitDict Pflicht | object | Initialisierungsobjekt. Zusätzlich zu den Optionen von EventInit (bubbles, cancelable, composed) enthält es:
|
Rückgabewert
VRDisplayEvent-Objekt. Seine Eigenschaften display und reason werden aus eventInitDict übernommen.Beispiele
Synthetisches Ereignis erzeugen und auslösen
// Nur ausführen, wenn der Browser WebVR unterstützt
const testeVrEreignis = async () => {
if (!('getVRDisplays' in navigator) || typeof VRDisplayEvent === 'undefined') {
console.log('WebVR wird nicht unterstützt – bitte WebXR verwenden.');
return;
}
const [display] = await navigator.getVRDisplays();
if (!display) {
console.log('Kein VR-Gerät gefunden.');
return;
}
window.addEventListener('vrdisplayactivate', (event) => {
console.log(`Aktiviert: ${event.display.displayName}, Grund: ${event.reason}`);
});
const event = new VRDisplayEvent('vrdisplayactivate', {
display,
reason: 'mounted'
});
window.dispatchEvent(event);
};
testeVrEreignis();
Eigenschaften eines erzeugten Ereignisses prüfen
const pruefeEreignis = async () => {
if (typeof VRDisplayEvent === 'undefined') {
console.log('VRDisplayEvent nicht verfügbar');
return;
}
const [display] = await navigator.getVRDisplays();
if (!display) return;
const event = new VRDisplayEvent('vrdisplaydisconnect', { display });
console.log(event.type); // Ereignistyp
console.log(event.display === display); // Referenz auf das Gerät
console.log(event.reason); // ohne Angabe nicht gesetzt
console.log(event instanceof Event);
};
pruefeEreignis();
Moderne Alternative: WebXR-Sitzungsereignisse
// Empfohlener Ersatz für WebVR-Ereignisse
const starteXr = async () => {
if (!navigator.xr || !(await navigator.xr.isSessionSupported('immersive-vr'))) {
console.log('immersive-vr nicht verfügbar');
return;
}
// Muss aus einer Benutzeraktion heraus aufgerufen werden
const session = await navigator.xr.requestSession('immersive-vr');
session.addEventListener('visibilitychange', () => {
console.log('Sichtbarkeit:', session.visibilityState);
});
session.addEventListener('end', () => console.log('XR-Sitzung beendet'));
};
document.querySelector('#vr-button')?.addEventListener('click', starteXr);
// Wichtig · Fallstricke
- Veraltet und nicht standardisiert: WebVR 1.1 wurde nie zum Standard und ist aus aktuellen Browsern entfernt. Chrome hat es nur hinter Flags oder in Origin Trials angeboten, in Firefox wurde es entfernt. Nutzen Sie stattdessen die WebXR Device API.
- Funktionsprüfung ist Pflicht: Prüfen Sie vor dem Aufruf mit
typeof VRDisplayEvent !== 'undefined', ob der Konstruktor existiert. Sonst wird einReferenceErrorausgelöst. displayist ein Pflichtfeld und muss ein echtesVRDisplay-Objekt sein. Ein einfaches Objekt als Ersatz führt zu einemTypeError.- Ereignisse, die Sie selbst mit
dispatchEvent()auslösen, habenisTrusted === false. Sie gelten daher nicht als Benutzeraktion. Ein Aufruf vonVRDisplay.requestPresent()in einem solchen Handler kann deshalb abgelehnt werden. - Nur Ereignisse mit dem Grund
reason: \"navigation\"oder\"requested\", die der Browser selbst auslöst, erlauben es, ohne Klick in den Präsentationsmodus zu wechseln.