Signatur
Beschreibung
Die schreibgeschützte Eigenschaft device eines HIDInputReportEvent verweist auf die HIDDevice-Instanz, die den Eingabereport gesendet hat. Das Event wird als inputreport auf dem geöffneten Gerät ausgelöst, sobald dieses Daten liefert, etwa Tastendrücke eines Gamepads, Werte eines Sensors oder Statusmeldungen eines Makro-Keypads.
Nützlich ist die Eigenschaft vor allem, wenn ein gemeinsamer Handler für mehrere Geräte verwendet wird. Über event.device lässt sich dann feststellen, welches Gerät den Report geschickt hat, etwa anhand von vendorId, productId oder productName. So kann man ohne eigene Zuordnungstabellen gezielt auf das richtige Gerät antworten, z. B. per sendReport().
Der Wert ist dieselbe Objektreferenz, die auch navigator.hid.requestDevice() bzw. navigator.hid.getDevices() liefern. Ein Vergleich mit === funktioniert also zuverlässig. Die eigentlichen Nutzdaten stehen in event.data (ein DataView), die Report-Kennung in event.reportId.
Rückgabewert
HIDDevice-Objekt der HID-Schnittstelle, die den Eingabereport gesendet hat.Beispiele
Gerät im Eingabereport identifizieren
const connect = async () => {
// Muss durch eine Benutzeraktion (z. B. Klick) ausgelöst werden
const [device] = await navigator.hid.requestDevice({ filters: [] });
if (!device) return;
await device.open();
device.addEventListener('inputreport', (event) => {
const { device, reportId, data } = event;
console.log(`${device.productName} (VID 0x${device.vendorId.toString(16)}) → Report ${reportId}, ${data.byteLength} Bytes`);
});
};
document.querySelector('#connect').addEventListener('click', connect);
Ein Handler für mehrere Geräte
const onReport = (event) => {
const dev = event.device;
// Nach Geräteart unterscheiden
if (dev.vendorId === 0x054c) {
console.log('PlayStation-Controller:', new Uint8Array(event.data.buffer));
} else {
console.log(`Anderes Gerät: ${dev.productName}`);
}
};
const devices = await navigator.hid.getDevices();
for (const device of devices) {
if (!device.opened) await device.open();
device.addEventListener('inputreport', onReport);
}
Auf das sendende Gerät antworten
navigator.hid.addEventListener('connect', async ({ device }) => {
await device.open();
device.oninputreport = async (event) => {
const firstByte = event.data.getUint8(0);
if (firstByte === 0x01) {
// Bestätigung an genau das Gerät zurücksenden, das gemeldet hat
await event.device.sendReport(0x02, new Uint8Array([0xff]));
console.log('Bestätigung gesendet an', event.device.productName);
}
};
});
// Wichtig · Fallstricke
- Browser-Kompatibilität: WebHID ist experimentell und nur in Chromium-basierten Desktop-Browsern (Chrome, Edge, Opera ab Version 89) verfügbar. Firefox und Safari unterstützen die API nicht. Deshalb vorher mit
'hid' in navigatorprüfen. - Die API ist nur in sicheren Kontexten (HTTPS) verfügbar und kann per Permissions-Policy (
hid) gesperrt sein, z. B. in iframes. inputreport-Events kommen nur, wenn das Gerät mitopen()geöffnet wurde. Nachclose()oder beim Trennen des Geräts bleiben sie aus.- Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird ignoriert bzw. löst im Strict Mode einen Fehler aus.
- Manche Geräte bieten mehrere HID-Schnittstellen an, die als eigene
HIDDevice-Objekte erscheinen.event.devicesteht immer für die konkrete Schnittstelle, die den Report gesendet hat. - Die API gibt es auch in Dedicated Workers (Chrome 117+), nicht aber in Service Workern.