Signatur
Beschreibung
Die Eigenschaft opened eines USBDevice-Objekts ist true, sobald USBDevice.open() erfolgreich abgeschlossen wurde. Nach USBDevice.close() oder wenn das Gerät getrennt wird, ist sie wieder false. Nur bei geöffnetem Gerät kann man Konfigurationen auswählen, Interfaces beanspruchen und Daten übertragen (transferIn(), transferOut(), controlTransferIn() usw.).
Typischerweise prüft man opened vor einem Aufruf von open(), damit ein Gerät, das schon geöffnet ist, nicht noch einmal geöffnet wird. Das kommt zum Beispiel vor, wenn man Geräte über navigator.usb.getDevices() wiederherstellt oder mehrere Programmteile auf dasselbe Gerät zugreifen. Ebenso kann man vor dem Aufräumen prüfen, ob close() überhaupt nötig ist.
Die Eigenschaft ist schreibgeschützt. Wenn man ihr etwas zuweist, wird das ignoriert, im Strict Mode gibt es einen TypeError. Den Zustand ändert man ausschließlich über open() und close().
Rückgabewert
true, wenn eine Sitzung mit dem Gerät offen ist, sonst false.Beispiele
Gerät auswählen und Zustand vor und nach open() prüfen
// Muss durch eine Nutzeraktion (z. B. Klick) ausgelöst werden
const button = document.querySelector('#connect');
button.addEventListener('click', async () => {
try {
const device = await navigator.usb.requestDevice({
filters: [{ vendorId: 0x2341 }] // z. B. Arduino
});
console.log('Vor open():', device.opened);
await device.open();
console.log('Nach open():', device.opened);
} catch (err) {
console.error('USB-Fehler:', err);
}
});
Hilfsfunktion: nur öffnen, wenn nötig
const ensureOpen = async (device) => {
if (!device.opened) {
await device.open();
}
if (device.configuration === null) {
await device.selectConfiguration(1);
}
await device.claimInterface(0);
return device;
};
// Früher freigegebene Geräte ohne erneute Nachfrage wiederverwenden
const [device] = await navigator.usb.getDevices();
if (device) {
await ensureOpen(device);
console.log(`${device.productName} bereit:`, device.opened);
}
Sauber schließen beim Verlassen der Seite oder beim Trennen
const closeIfOpen = async (device) => {
if (device?.opened) {
await device.close();
console.log('Sitzung geschlossen:', !device.opened);
}
};
navigator.usb.addEventListener('disconnect', (event) => {
// Nach dem Trennen ist opened automatisch false
console.log('Getrennt, opened =', event.device.opened);
});
const [device] = await navigator.usb.getDevices();
window.addEventListener('pagehide', () => closeIfOpen(device));
// Wichtig · Fallstricke
- Browser-Unterstützung: WebUSB gibt es nur in Chromium-Browsern auf dem Desktop und unter Android (Chrome, Edge, Opera). Firefox und Safari unterstützen die API nicht. Deshalb vorher prüfen:
'usb' in navigator. - Sicherer Kontext: Die API funktioniert nur über HTTPS (oder
localhost).requestDevice()braucht eine Nutzeraktion. In iframes muss zusätzlich die Permissions Policyusberlaubt sein. opened === truebedeutet nicht, dass schon ein Interface beansprucht ist.claimInterface()kann trotzdem fehlschlagen, zum Beispiel wenn ein Treiber des Betriebssystems das Interface belegt (unter Windows oft ein Problem).- Wenn man
open()auf einem bereits geöffneten Gerät aufruft, löst das Promise sofort auf. Die Prüfung verhindert also vor allem unnötige Aufrufe und Rennbedingungen, wenn mehrereopen()/close()-Aufrufe gleichzeitig laufen. - Der Wert ändert sich asynchron erst, wenn das Promise von
open()bzw.close()aufgelöst ist. Direkt nach dem Aufruf ohneawaitsteht noch der alte Wert darin. - Auch in Web Workern verfügbar (Chromium), in Service Workern nur eingeschränkt.