Sobre este problema HTML
Em HTML, os atributos booleanos como selected funcionam de forma diferente do que você poderia esperar se vier de uma linguagem de programação. A mera presença de um atributo booleano significa “true”, e a sua ausência significa “false”. Definir selected="true" é inválido porque os únicos valores permitidos para um atributo booleano são a string vazia ("") ou o nome do próprio atributo (por exemplo, selected="selected"). O valor "true" não é reconhecido pela especificação HTML, razão pela qual o validador W3C o sinaliza.
Isto é importante por várias razões. Primeiro, viola a especificação HTML WHATWG, que define explicitamente como os atributos booleanos devem ser escritos. Segundo, embora a maioria dos navegadores seja tolerante e ainda trate selected="true" como se a opção estivesse selecionada, depender deste comportamento permissivo é arriscado — pode levar a inconsistências entre navegadores ou ferramentas que analisam HTML de forma rigorosa. Terceiro, markup inválido pode causar problemas para tecnologias assistivas, ferramentas de teste automático e processadores HTML do lado do servidor que seguem a especificação de perto.
A mesma regra aplica-se a outros atributos booleanos como disabled, checked, readonly, multiple, required e hidden. Nenhum deles deve ser definido como "true" ou "false".
Vale também referir que definir um atributo booleano como "false" (por exemplo, selected="false") não o desativa — a mera presença do atributo ativa-o. Para desativar um atributo booleano, deve removê-lo completamente do elemento.
Exemplos
❌ Inválido: usar selected="true"
<select name="color">
<option selected="true">Red</option>
<option>Green</option>
<option>Blue</option>
</select>
Isto desencadeia o erro de validação porque "true" não é um valor válido para o atributo booleano selected.
✅ Válido: atributo simples (preferido)
<select name="color">
<option selected>Red</option>
<option>Green</option>
<option>Blue</option>
</select>
A forma mais simples e comum de escrever um atributo booleano — incluir apenas o nome do atributo sem valor.
✅ Válido: valor de string vazia
<select name="color">
<option selected="">Red</option>
<option>Green</option>
<option>Blue</option>
</select>
Uma string vazia é um valor válido para qualquer atributo booleano segundo a especificação HTML.
✅ Válido: nome do atributo como valor
<select name="color">
<option selected="selected">Red</option>
<option>Green</option>
<option>Blue</option>
</select>
Usar o nome do próprio atributo como seu valor também é válido. Esta forma é por vezes vista em markup estilo XHTML e em sistemas de templates.
❌ Inválido: usar selected="false" para desselecionar
<select name="color">
<option selected="false">Red</option>
<option>Green</option>
<option>Blue</option>
</select>
Isto é tanto inválido quanto enganador. A opção continuará selecionada porque o atributo selected está presente. Para não selecionar uma opção, simplesmente omita o atributo:
<select name="color">
<option>Red</option>
<option>Green</option>
<option>Blue</option>
</select>
Encontre problemas como este automaticamente
O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.
Saiba mais: