APIs de la web, hoyLaboratorio · Alex Harto

WebHID

Dispositivos HID poco comunes desde una página: mandos especiales, pedales, tabletas, teclados programables…

En tu navegador: comprobando…Revisado 1 oct 2026

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ónEscritorioMóvil
ChromeEdgeFirefoxSafariChrome AndroidFirefox AndroidSafari iOS
navigator.hid89Chrome: 89 89Edge: 89 —Firefox: No—Safari: No154flag1Chrome: 154 flag—Firefox: No—Safari: No
  1. 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>

Novedades

  1. Chrome 154 para Android: prueba para desarrolladores; activación prevista en Chrome 157.
  2. Intent to Prototype de WebHID en Android.
  3. El WHATWG abre un área de hardware, de momento solo para Web Serial; WebHID y el resto quedan a la espera.

Ten en cuenta

  1. requestDevice() necesita un gesto del usuario; getDevices() devuelve los ya autorizados sin preguntar.
  2. Teclados, ratones y otros dispositivos sensibles están bloqueados por diseño.
  3. Funciona en workers dedicados desde Chrome 131 (pero requestDevice() solo en la ventana).

Más información

Fuentes