Signatur
Beschreibung
Die Eigenschaft session eines XRInputSourcesChangeEvent verweist auf die XRSession, bei der das Ereignis inputsourceschange ausgelöst wurde. Das Ereignis tritt auf, wenn Eingabequellen hinzukommen oder wegfallen, etwa wenn ein Controller eingeschaltet, abgelegt oder das Hand-Tracking aktiviert wird.
Nützlich ist die Eigenschaft vor allem, wenn ein einziger Handler für mehrere Sitzungen verwendet wird oder wenn der Handler ausgelagert ist und keinen direkten Zugriff auf die Sitzungsvariable hat. Über event.session kommt man dann z. B. an session.inputSources, session.renderState oder kann Referenzräume anfordern.
Der Wert ist identisch mit event.target, da das Ereignis direkt auf der Sitzung ausgelöst wird. Welche Quellen konkret hinzugekommen oder weggefallen sind, verraten die Eigenschaften added und removed desselben Ereignisses.
Rückgabewert
XRSession, auf die sich die Änderung der Eingabequellen bezieht. Schreibgeschützt.Beispiele
Sitzung im inputsourceschange-Handler auswerten
const startXR = async () => {
const session = await navigator.xr.requestSession('immersive-vr');
session.addEventListener('inputsourceschange', (event) => {
// event.session ist dieselbe Sitzung wie session
console.log('Gleiche Sitzung:', event.session === session);
console.log('Aktive Eingabequellen:', event.session.inputSources.length);
});
};
document.querySelector('#vr-button').addEventListener('click', startXR);
Ausgelagerter Handler ohne globale Sitzungsvariable
const controllerModels = new Map();
const handleInputSourcesChange = (event) => {
const { session, added, removed } = event;
for (const source of added) {
controllerModels.set(source, { hand: source.handedness });
console.log(`Neu: ${source.handedness}-Controller (${source.targetRayMode})`);
}
for (const source of removed) {
controllerModels.delete(source);
console.log(`Entfernt: ${source.handedness}`);
}
console.log('Sitzungsmodus:', session.environmentBlendMode);
};
const start = async () => {
const session = await navigator.xr.requestSession('immersive-vr');
session.addEventListener('inputsourceschange', handleInputSourcesChange);
};
document.querySelector('#vr-button').addEventListener('click', start);
Handler über on-Property setzen und beim Sitzungsende aufräumen
const start = async () => {
const session = await navigator.xr.requestSession('immersive-ar');
session.oninputsourceschange = (event) => {
const hasHands = [...event.session.inputSources].some((s) => s.hand);
console.log('Hand-Tracking aktiv:', hasHands);
};
session.addEventListener('end', () => {
session.oninputsourceschange = null;
});
};
document.querySelector('#ar-button').addEventListener('click', start);
// Wichtig · Fallstricke
- Schreibgeschützt: Die Eigenschaft lässt sich nicht überschreiben; beim manuellen Erzeugen mit
new XRInputSourcesChangeEvent(type, init)istsessionim Init-Objekt Pflicht. - Sichere Umgebung nötig: WebXR steht nur in sicheren Kontexten (HTTPS) zur Verfügung, und eine Sitzung kann nur nach einer Benutzeraktion angefordert werden.
- Browser-Unterstützung: Vor allem Chromium-basierte Browser und der Meta Quest Browser. Firefox und Safari auf dem Desktop unterstützen WebXR nicht standardmäßig. Vorher mit
'xr' in navigatorundnavigator.xr.isSessionSupported()prüfen. - Nach dem Ereignis
endist die Sitzung beendet; Verweise aufevent.sessionsollten dann nicht mehr für neue Anfragen genutzt werden. - Beim Start einer Sitzung wird
inputsourceschangemeist sofort für die bereits verbundenen Quellen ausgelöst. Den Handler also direkt nachrequestSession()registrieren.