WebHID
Dispositivos HID poco comunes desde una página: mandos especiales, pedales, tabletas, teclados programables…
HID es el protocolo de teclados, ratones y mandos. WebHID deja que una página hable con los dispositivos que el sistema no gestiona del todo: lee sus informes de entrada en bruto y les envía informes de salida y de características (luces, vibración, configuración).
Solo Chrome y Edge de escritorio, desde la 89. Chrome para Android lo tiene como prueba para desarrolladores en la 154 y prevé activarlo en la 157. Mozilla y WebKit se oponen por motivos de seguridad.
Para qué sirve
- Configurar periféricos sin instalar programas
- Funciones avanzadas de mandos (luces, giroscopio)
- Pedales, botoneras y controladores de estudio
Demo
Conecta un dispositivo HID y elígelo en el selector: un mando de PlayStation o de Switch, una tableta gráfica, un pedal, una botonera… Verás sus informes de entrada en bruto, byte a byte; los que cambian se iluminan. Teclados y ratones están bloqueados por seguridad.
Compatibilidad
Disponibilidad limitada| Función | Escritorio | Móvil | |||||
|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Safari | Chrome Android | Firefox Android | Safari iOS | |
| navigator.hid | 89Chrome: 89 | 89Edge: 89 | —Firefox: No | —Safari: No | 154flag1Chrome: 154 flag | —Firefox: No | —Safari: No |
- 1Prueba para desarrolladores en 154; está previsto activarla en Chrome 157.
Compatibilidad generada en cada publicación desde MDN browser-compat-data 8.1.3 (24 sep 2026) · web-features 3.40.0 · revisión manual: 1 oct 2026
Código mínimo
<!doctype html>
<meta charset="utf-8">
<title>WebHID · ejemplo mínimo</title>
<!-- Lee los informes de entrada en bruto de un dispositivo HID (mando, teclado especial, pedal…).
Chrome y Edge de escritorio. HTTPS o localhost. -->
<button id="connect">Conectar dispositivo HID</button>
<pre id="out"></pre>
<script>
const out = document.querySelector('#out');
const hex = (view) => [...new Uint8Array(view.buffer, view.byteOffset, view.byteLength)].map((b) => b.toString(16).padStart(2, '0')).join(' ');
document.querySelector('#connect').onclick = async () => {
if (!('hid' in navigator)) return (out.textContent = 'WebHID no está disponible en este navegador.');
// Sin filtros se listan todos; en producción filtra por vendorId/productId o por usagePage
const [device] = await navigator.hid.requestDevice({ filters: [] });
if (!device) return;
await device.open();
out.textContent = `${device.productName} · vendor 0x${device.vendorId.toString(16)} · product 0x${device.productId.toString(16)}\n`;
device.addEventListener('inputreport', (e) => {
out.textContent = `${device.productName}\ninforme ${e.reportId}: ${hex(e.data)}`;
});
};
// Los dispositivos ya autorizados vuelven sin preguntar
navigator.hid?.getDevices().then((devices) => devices.length && console.log('Autorizados:', devices));
</script><!doctype html>
<meta charset="utf-8">
<title>WebHID · ejemplo mínimo</title>
<!-- Lee los informes de entrada en bruto de un dispositivo HID (mando, teclado especial, pedal…).
Chrome y Edge de escritorio. HTTPS o localhost. -->
<button id="connect">Conectar dispositivo HID</button>
<pre id="out"></pre>
<script>
const out = document.querySelector('#out');
const hex = (view) => [...new Uint8Array(view.buffer, view.byteOffset, view.byteLength)].map((b) => b.toString(16).padStart(2, '0')).join(' ');
document.querySelector('#connect').onclick = async () => {
if (!('hid' in navigator)) return (out.textContent = 'WebHID no está disponible en este navegador.');
// Sin filtros se listan todos; en producción filtra por vendorId/productId o por usagePage
const [device] = await navigator.hid.requestDevice({ filters: [] });
if (!device) return;
await device.open();
out.textContent = `${device.productName} · vendor 0x${device.vendorId.toString(16)} · product 0x${device.productId.toString(16)}\n`;
device.addEventListener('inputreport', (e) => {
out.textContent = `${device.productName}\ninforme ${e.reportId}: ${hex(e.data)}`;
});
};
// Los dispositivos ya autorizados vuelven sin preguntar
navigator.hid?.getDevices().then((devices) => devices.length && console.log('Autorizados:', devices));
</script>Novedades
Ten en cuenta
- requestDevice() necesita un gesto del usuario; getDevices() devuelve los ya autorizados sin preguntar.
- Teclados, ratones y otros dispositivos sensibles están bloqueados por diseño.
- Funciona en workers dedicados desde Chrome 131 (pero requestDevice() solo en la ventana).
Más información
Fuentes
- Chrome Status · release notes 15422 sep 2026
- Blink · Intent to Prototype WebHID on Android13 ago 2026
- WHATWG SG #264ago 2026
- Mozilla standards-positions #459consultado el 1 oct 2026
- WebKit standards-positions #510consultado el 1 oct 2026