Acerca de este problema HTML
En HTML, los atributos booleanos como selected funcionan de manera diferente a lo que podrías esperar si vienes de un lenguaje de programación. La sola presencia de un atributo booleano significa “verdadero”, y su ausencia significa “falso”. Establecer selected="true" es inválido porque los únicos valores permitidos para un atributo booleano son la cadena vacía ("") o el propio nombre del atributo (por ejemplo, selected="selected"). El valor "true" no es reconocido por la especificación HTML, razón por la cual el validador W3C lo marca como error.
Esto importa por varias razones. Primero, viola la especificación HTML de WHATWG, que define explícitamente cómo deben escribirse los atributos booleanos. Segundo, aunque la mayoría de navegadores son tolerantes y seguirán tratando selected="true" como si la opción estuviera seleccionada, depender de este comportamiento permisivo es arriesgado — puede llevar a inconsistencias entre navegadores o herramientas que analizan HTML de manera estricta. Tercero, el marcado inválido puede causar problemas para tecnologías asistivas, herramientas de testing automatizado y procesadores HTML del lado del servidor que siguen la especificación de cerca.
La misma regla se aplica a otros atributos booleanos como disabled, checked, readonly, multiple, required y hidden. Ninguno de ellos debe establecerse a "true" o "false".
También vale la pena mencionar que establecer un atributo booleano a "false" (por ejemplo, selected="false") no lo desactiva — la mera presencia del atributo lo activa. Para desactivar un atributo booleano, debes eliminarlo completamente del elemento.
Ejemplos
❌ Inválido: usando selected="true"
<select name="color">
<option selected="true">Red</option>
<option>Green</option>
<option>Blue</option>
</select>
Esto genera el error de validación porque "true" no es un valor válido para el atributo booleano selected.
✅ Válido: atributo simple (preferido)
<select name="color">
<option selected>Red</option>
<option>Green</option>
<option>Blue</option>
</select>
La forma más simple y común de escribir un atributo booleano — simplemente incluir el nombre del atributo sin valor.
✅ Válido: valor de cadena vacía
<select name="color">
<option selected="">Red</option>
<option>Green</option>
<option>Blue</option>
</select>
Una cadena vacía es un valor válido para cualquier atributo booleano según la especificación HTML.
✅ Válido: nombre del atributo como valor
<select name="color">
<option selected="selected">Red</option>
<option>Green</option>
<option>Blue</option>
</select>
Usar el propio nombre del atributo como su valor también es válido. Esta forma a veces se ve en marcado estilo XHTML y en sistemas de plantillas.
❌ Inválido: usando selected="false" para deseleccionar
<select name="color">
<option selected="false">Red</option>
<option>Green</option>
<option>Blue</option>
</select>
Esto es tanto inválido como engañoso. La opción seguirá estando seleccionada porque el atributo selected está presente. Para no seleccionar una opción, simplemente omite el atributo:
<select name="color">
<option>Red</option>
<option>Green</option>
<option>Blue</option>
</select>
Encuentra problemas como este automáticamente
Rocket Validator escanea miles de páginas en segundos, detectando problemas de HTML en todo tu sitio web.
Más información: