Sobre este problema HTML
A especificação HTML define atributos booleanos como atributos cuja presença indica um estado true e cuja ausência indica false. De acordo com o padrão WHATWG HTML, um atributo booleano pode ter apenas três representações válidas:
-
O nome do atributo sozinho (ex.:
async) -
O atributo com um valor de string vazio (ex.:
async="") -
O atributo com um valor que corresponde ao seu próprio nome, sem distinção de maiúsculas e minúsculas (ex.:
async="async")
Qualquer outro valor — como async="true", async="1", async="yes", ou async="false" — é HTML inválido e irá gerar este erro de validação. Este é um equívoco comum porque os programadores frequentemente assumem que os atributos booleanos funcionam como valores booleanos nas linguagens de programação, onde você atribuiria true ou false.
Porque isto é importante
Embora a maioria dos navegadores seja tolerante e trate qualquer valor de async como o estado true (uma vez que o atributo está presente independentemente do seu valor), usar valores inválidos cria vários problemas:
- Conformidade com padrões: HTML inválido pode causar problemas com analisadores rigorosos, validadores, ou ferramentas que processam a sua marcação.
-
Intenção enganadora: Escrever
async="false"não desativa o comportamento async — o atributo ainda está presente, então o navegador trata-o como ativado. Isto pode levar a bugs confusos onde um script se comporta de forma assíncrona mesmo quando o programador pretendia o contrário. -
Manutenibilidade: Outros programadores que leiam o código podem interpretar mal
async="false"como realmente desativando o carregamento async.
Para desativar o comportamento async, você deve remover o atributo completamente em vez de defini-lo como "false".
Como o async funciona
Para scripts clássicos com um atributo src, o atributo async faz com que o script seja obtido em paralelo com a análise HTML e executado assim que estiver disponível, sem esperar que o documento termine de ser analisado.
Para scripts de módulo (type="module"), o atributo async faz com que o módulo e todas as suas dependências sejam obtidos em paralelo e executados assim que estiverem prontos, em vez de esperar até que o documento tenha sido analisado (que é o comportamento adiado padrão para módulos).
Exemplos
❌ Inválido: valores arbitrários no async
<!-- Incorreto: "true" não é um valor de atributo booleano válido -->
<script async="true" src="app.js"></script>
<!-- Incorreto: "1" não é um valor de atributo booleano válido -->
<script async="1" src="analytics.js"></script>
<!-- Incorreto: "yes" não é um valor de atributo booleano válido -->
<script async="yes" src="tracker.js"></script>
<!-- Incorreto e enganador: isto NÃO desativa o async -->
<script async="false" src="app.js"></script>
✅ Válido: uso correto de atributo booleano
<!-- Preferido: nome do atributo sozinho -->
<script async src="app.js"></script>
<!-- Também válido: valor de string vazio -->
<script async="" src="app.js"></script>
<!-- Também válido: valor que corresponde ao nome do atributo -->
<script async="async" src="app.js"></script>
<!-- Forma correta de desativar o async: remover o atributo -->
<script src="app.js"></script>
✅ Válido: async com scripts de módulo
<script async type="module" src="app.mjs"></script>
<script async type="module">
import { init } from './utils.mjs';
init();
</script>
Esta mesma regra aplica-se a todos os atributos booleanos em HTML, incluindo defer, disabled, checked, required, hidden, e outros. Em caso de dúvida, use o nome do atributo sozinho sem valor — é a forma mais limpa e mais amplamente reconhecida.
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: