Warning Atributo booleano con un valor engañoso

Por qué disabled="false" sigue deshabilitando el elemento, y los únicos valores que realmente significan "apagado" para un atributo booleano HTML.

El validador advierte cuando un atributo booleano (disabled, checked, required, readonly, hidden y similares) recibe un valor que no está vacío, no es el propio nombre del atributo, y parece estar intentando significar "falso".

Ejemplo

<!-- Sigue deshabilitado — el valor se ignora -->
<input disabled="false">
<input disabled="0">

<!-- Realmente habilitado: omitir el atributo -->
<input>

<!-- Formas válidas de escribir "disabled" -->
<input disabled>
<input disabled="">
<input disabled="disabled">

Por qué importa

Los atributos booleanos de HTML funcionan por presencia, no por su valor — la especificación los define como verdaderos si el atributo está presente, y falsos solo si está completamente ausente de la etiqueta. disabled="false" es algo muy natural de escribir viniendo de JavaScript o de la mayoría de los otros lenguajes, donde una cadena como "false" sería falsy o claramente distinta de "true". En el markup HTML no es así: el atributo está presente, así que el elemento queda deshabilitado, exactamente como si se hubiera escrito disabled="true" o simplemente disabled. Esta es una de las fuentes más comunes de errores tipo "por qué esto sigue deshabilitado/marcado/requerido si lo puse en false", sobre todo en plantillas renderizadas en el servidor que convierten un booleano en una cadena dentro del valor del atributo.

Frequently asked questions

¿Cómo apago realmente un atributo booleano?

Elimina el atributo de la etiqueta por completo — no hay ningún valor que se pueda poner que signifique "falso". En JavaScript, usa element.removeAttribute("disabled") o la forma más directa element.disabled = false, que maneja esto correctamente.

¿Esto es diferente en frameworks como React o Vue?

Los frameworks que manejan el DOM por ti (React, Vue y similares) suelen manejar correctamente las props booleanas por debajo — pasar disabled={false} en React elimina el atributo en vez de escribir la cadena literal "false". Este problema es específicamente sobre markup HTML crudo o salida de plantillas donde el valor se convierte directamente en cadena dentro del atributo.