Start · Sprachen · JavaScript · Referenz · HIDInputReportEvent.device

HIDInputReportEvent.device

Eigenschaft

Schreibgeschützte Eigenschaft, die das <code>HIDDevice</code> zurückgibt, von dem der empfangene Eingabereport stammt.

seit JavaScript Chrome/Edge 89+ (WebHID, nur sichere Kontexte) Kategorie: webapi

Signatur

HIDInputReportEvent.device

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

Typ
HIDDevice
Beschreibung
Das 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);
Beispiel-Keypad (VID 0x46d) → Report 1, 8 Bytes

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);
}
PlayStation-Controller: Uint8Array(63) [128, 127, ...]

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);
    }
  };
});
Bestätigung gesendet an Mein HID-Gerät

// 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 navigator prü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 mit open() geöffnet wurde. Nach close() 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.device steht 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.