Start · Sprachen · JavaScript · Referenz · XRInputSourceArray.keys()

XRInputSourceArray.keys()

Methode

Gibt einen Iterator über die Indizes (<code>0</code> bis <code>length - 1</code>) aller Eingabequellen in einem <code>XRInputSourceArray</code> zurück.

seit JavaScript WebXR Device API; Chromium-basierte Browser (Chrom Kategorie: webapi

Signatur

XRInputSourceArray.prototype.keys()

Beschreibung

Die Methode keys() des Interfaces XRInputSourceArray liefert einen Iterator, der nacheinander die numerischen Schlüssel – also die Indizes – aller aktuell verbundenen Eingabequellen einer WebXR-Sitzung zurückgibt. Ein XRInputSourceArray bekommst du über XRSession.inputSources. Es enthält die Controller, Hände (Hand-Tracking), Blick-Eingaben oder Bildschirm-Berührungen, die der Sitzung zur Verfügung stehen.

XRInputSourceArray ist kein echtes Array, sondern ein Array-ähnliches Objekt. Deshalb fehlen Methoden wie map() oder filter(). Es bietet aber die Iterationsmethoden keys(), values(), entries() und forEach() und ist mit for...of iterierbar. keys() verhält sich genauso wie Array.prototype.keys().

Sinnvoll ist keys() vor allem dann, wenn du nur den Index brauchst – zum Beispiel, um Eingabequellen einer eigenen Datenstruktur (etwa Controller-Modellen in der Szene) zuzuordnen oder um per Index gezielt auf inputSources[i] zuzugreifen. Brauchst du Index und Objekt zusammen, ist entries() meist die bessere Wahl.

Rückgabewert

Typ
Iterator<number>
Beschreibung
Ein Array-Iterator, der die Indizes 0, 1, … length - 1 der Eingabequellen liefert. Er lässt sich mit for...of, dem Spread-Operator oder next() auslesen.

Beispiele

Indizes aller Eingabequellen ausgeben

const session = await navigator.xr.requestSession('immersive-vr');

session.addEventListener('inputsourceschange', () => {
  for (const index of session.inputSources.keys()) {
    const source = session.inputSources[index];
    console.log(`Quelle ${index}: ${source.handedness} (${source.targetRayMode})`);
  }
});
Quelle 0: left (tracked-pointer) Quelle 1: right (tracked-pointer)

Indizes per Spread-Operator als echtes Array

const onXRFrame = (time, frame) => {
  const session = frame.session;
  const indices = [...session.inputSources.keys()];
  console.log('Aktive Indizes:', indices);
  session.requestAnimationFrame(onXRFrame);
};

session.requestAnimationFrame(onXRFrame);
Aktive Indizes: [0, 1]

Iterator manuell mit next() durchlaufen

const iterator = session.inputSources.keys();
let result = iterator.next();

while (!result.done) {
  const source = session.inputSources[result.value];
  if (source.gamepad) {
    console.log(`Index ${result.value} hat ${source.gamepad.buttons.length} Tasten`);
  }
  result = iterator.next();
}
Index 0 hat 7 Tasten Index 1 hat 7 Tasten

// Wichtig · Fallstricke

  • Indizes sind nicht dauerhaft: Wird ein Controller getrennt oder kommt einer hinzu (Ereignis inputsourceschange), können sich die Indizes verschieben. Speichere darum nicht den Index, sondern das XRInputSource-Objekt selbst, z. B. als Schlüssel in einer Map oder WeakMap.
  • Momentaufnahme: Ändert sich das Array, während du iterierst, kann das Ergebnis unerwartet sein. Hole die Eingabequellen am besten in jedem Frame neu.
  • Ein XRInputSourceArray ist kein echtes Array. Für map() oder filter() brauchst du zuerst Array.from(session.inputSources).
  • Kompatibilität: WebXR gibt es nur in sicheren Kontexten (HTTPS). Unterstützt wird es vor allem in Chromium-basierten Browsern und im Meta-Quest-Browser. Firefox und Safari auf dem Desktop bieten keine Unterstützung. Prüfe die Verfügbarkeit vorher mit navigator.xr?.isSessionSupported().