Start · Sprachen · JavaScript · Referenz · XRInputSourcesChangeEvent.session

XRInputSourcesChangeEvent.session

Eigenschaft

Schreibgeschützte Eigenschaft, die die <code>XRSession</code> liefert, deren Liste der Eingabequellen (Controller, Hände, Blick) sich geändert hat.

seit JavaScript WebXR Device API – Chromium-Browser (Chrome/Edge 7 Kategorie: webapi

Signatur

XRInputSourcesChangeEvent.session

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

Typ
XRSession
Beschreibung
Die 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);
Gleiche Sitzung: true Aktive Eingabequellen: 2

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);
Neu: left-Controller (tracked-pointer) Neu: right-Controller (tracked-pointer) Sitzungsmodus: opaque

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);
Hand-Tracking aktiv: false

// Wichtig · Fallstricke

  • Schreibgeschützt: Die Eigenschaft lässt sich nicht überschreiben; beim manuellen Erzeugen mit new XRInputSourcesChangeEvent(type, init) ist session im 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 navigator und navigator.xr.isSessionSupported() prüfen.
  • Nach dem Ereignis end ist die Sitzung beendet; Verweise auf event.session sollten dann nicht mehr für neue Anfragen genutzt werden.
  • Beim Start einer Sitzung wird inputsourceschange meist sofort für die bereits verbundenen Quellen ausgelöst. Den Handler also direkt nach requestSession() registrieren.