Signatur
Beschreibung
Die Eigenschaft session eines XRSessionEvent verweist auf das XRSession-Objekt, dessen Zustand sich geändert hat. Solche Ereignisse löst die WebXR Device API vor allem in zwei Situationen aus: beim Beenden einer Sitzung (end) und bei einer Änderung der Sichtbarkeit (visibilitychange), etwa wenn der Nutzer ein System-Menü im Headset öffnet.
Nützlich ist die Eigenschaft vor allem dann, wenn ein einziger Handler für mehrere Sitzungen zuständig ist – zum Beispiel wenn eine Anwendung nacheinander eine immersive-vr- und eine inline-Sitzung verwaltet. Über event.session findet man heraus, welche Sitzung betroffen ist, ohne auf äußere Variablen oder event.target angewiesen zu sein.
Typische Anwendungsfälle sind das Aufräumen nach Sitzungsende (Event-Listener entfernen, WebGL-Ressourcen freigeben, UI zurücksetzen) sowie das Pausieren oder Fortsetzen von Spiellogik abhängig von event.session.visibilityState.
Rückgabewert
XRSession-Objekt, auf das sich das Ereignis bezieht. Der Wert wird beim Erzeugen des Ereignisses über das Init-Dictionary ({ session }) festgelegt und kann danach nicht verändert werden.Beispiele
Aufräumen beim Beenden einer immersiven Sitzung
const startVR = async () => {
if (!navigator.xr || !(await navigator.xr.isSessionSupported('immersive-vr'))) {
console.log('immersive-vr wird nicht unterstützt');
return;
}
const session = await navigator.xr.requestSession('immersive-vr');
session.addEventListener('end', (event) => {
// event.session ist dieselbe Sitzung, die beendet wurde
console.log('Sitzung beendet:', event.session === session);
console.log('Modus war:', event.session.environmentBlendMode ?? 'unbekannt');
document.querySelector('#enter-vr').disabled = false;
});
};
document.querySelector('#enter-vr').addEventListener('click', startVR);
Ein gemeinsamer Handler für mehrere Sitzungen
const activeSessions = new Set();
const onVisibilityChange = (event) => {
const { session } = event;
const paused = session.visibilityState !== 'visible';
console.log(`Sitzung ${[...activeSessions].indexOf(session)}: ${session.visibilityState}`);
if (paused) {
// z. B. Physik oder Audio anhalten
}
};
const onEnd = (event) => {
event.session.removeEventListener('visibilitychange', onVisibilityChange);
activeSessions.delete(event.session);
console.log('Verbleibende Sitzungen:', activeSessions.size);
};
const track = (session) => {
activeSessions.add(session);
session.addEventListener('visibilitychange', onVisibilityChange);
session.addEventListener('end', onEnd, { once: true });
};
navigator.xr?.requestSession('inline').then(track);
XRSessionEvent manuell erzeugen (z. B. für Tests)
const simulateEnd = async () => {
const session = await navigator.xr.requestSession('inline');
const event = new XRSessionEvent('end', { session });
console.log(event.type); // 'end'
console.log(event.session === session); // true
// Schreibgeschützt: Zuweisung wird ignoriert (im strict mode TypeError)
try {
event.session = null;
} catch (err) {
console.log(err.name);
}
console.log(event.session === session);
};
simulateEnd();
// Wichtig · Fallstricke
- Schreibgeschützt:
sessionhat nur einen Getter. Eine Zuweisung wird ignoriert, in Modulen und im strict mode wirft sie einenTypeError. - Nach
endnicht mehr benutzbar: Die Sitzung ausevent.sessionist nach demend-Ereignis beendet. Aufrufe wierequestAnimationFrame()oderrequestReferenceSpace()bringen dann nichts mehr bzw. werden abgelehnt. Die Sitzung taugt nur noch zum Vergleichen und Aufräumen. - Pflichtangabe beim Konstruktor:
new XRSessionEvent(type, init)verlangtinit.session. Fehlt die Angabe, wird einTypeErrorgeworfen. - Browser-Unterstützung: Die API gibt es nur in Browsern mit WebXR (Chromium-basiert, Meta Quest Browser, Samsung Internet). Außerdem ist ein sicherer Kontext (HTTPS) nötig. Vor der Nutzung sollte man
navigator.xrundisSessionSupported()prüfen. Firefox und Safari auf dem Desktop unterstützen WebXR nicht standardmäßig. - Meist ist
event.sessionidentisch mitevent.target. Die Eigenschaft ist aber besser typisiert und auch bei weitergereichten oder manuell erzeugten Ereignissen eindeutig.