Signatur
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
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})`);
}
});
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);
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();
}
// 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 dasXRInputSource-Objekt selbst, z. B. als Schlüssel in einerMapoderWeakMap. - Momentaufnahme: Ändert sich das Array, während du iterierst, kann das Ergebnis unerwartet sein. Hole die Eingabequellen am besten in jedem Frame neu.
- Ein
XRInputSourceArrayist kein echtesArray. Fürmap()oderfilter()brauchst du zuerstArray.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().