Sobre este problema HTML
Compreender atributos booleanos em HTML
No HTML, os atributos booleanos funcionam de forma diferente dos atributos regulares. A presença de um atributo booleano num elemento representa true, e a sua ausência representa false. De acordo com a especificação HTML, um atributo booleano só pode ter três formas válidas:
-
Apenas o nome do atributo:
novalidate -
O atributo com um valor vazio:
novalidate="" -
O atributo com um valor que corresponde ao seu próprio nome (insensível a maiúsculas/minúsculas):
novalidate="novalidate"
Qualquer outro valor — como "true", "false", "1", "0", ou "yes" — é inválido e desencadeia este erro de validação. Esta é uma fonte comum de confusão, especialmente para programadores que vêm de frameworks como React (que usa noValidate={true}) ou de linguagens onde atributos booleanos aceitam strings explícitas de true/false.
Porque isto é importante
- Conformidade com as normas: Usar valores inválidos viola a especificação HTML e causará falhas na validação W3C.
-
Comportamento inesperado: Embora a maioria dos navegadores seja tolerante e trate qualquer valor de
novalidatecomo “presente” (o que significa que mesmonovalidate="false"desativaria a validação, não a ativaria), depender deste comportamento é pouco fiável e enganador para outros programadores que leiam o seu código. -
Manutenibilidade: Escrever
novalidate="false"sugere que o formulário deveria ser validado, mas o oposto é verdadeiro — o atributo está presente, pelo que a validação é ignorada. Isto cria código confuso e propenso a erros.
Sobre o atributo novalidate
O atributo novalidate diz ao navegador para ignorar a sua validação de restrições integrada quando o formulário é submetido. Sem ele, o navegador verifica campos obrigatórios, padrões de entrada, formatos de email e outras restrições antes de permitir a submissão.
Se novalidate não estiver definido no formulário, botões de submissão individuais ainda podem ignorar a validação numa base por botão usando o atributo formnovalidate num elemento <button>, <input type="submit">, ou <input type="image">.
Exemplos
❌ Inválido: Valor arbitrário em novalidate
<form method="post" novalidate="true">
<label>Email:
<input type="email" name="email" required>
</label>
<button>Submit</button>
</form>
Isto desencadeia o erro porque "true" não é um valor válido para um atributo booleano. Outras variações inválidas incluem:
<form method="post" novalidate="1">
<form method="post" novalidate="yes">
<form method="post" novalidate="false">
Note que novalidate="false" é especialmente perigoso — não ativa a validação. Porque o atributo está presente, o navegador desativa a validação independentemente do valor.
✅ Válido: Apenas o nome do atributo (recomendado)
<form method="post" novalidate>
<label>Email:
<input type="email" name="email" required>
</label>
<button>Submit</button>
</form>
✅ Válido: Valor de string vazia
<form method="post" novalidate="">
<label>Email:
<input type="email" name="email" required>
</label>
<button>Submit</button>
</form>
✅ Válido: Valor que corresponde ao nome do atributo
<form method="post" novalidate="novalidate">
<label>Email:
<input type="email" name="email" required>
</label>
<button>Submit</button>
</form>
✅ Válido: Remover o atributo para ativar a validação
Se quiser que o formulário seja validado, simplesmente remova o atributo novalidate completamente:
<form method="post">
<label>Email:
<input type="email" name="email" required>
</label>
<button>Submit</button>
</form>
✅ Usar formnovalidate num botão específico
Se quiser validação na submissão principal mas quiser ignorá-la para um botão “Guardar Rascunho”, use formnovalidate no botão em vez disso:
<form method="post">
<label>Email:
<input type="email" name="email" required>
</label>
<button>Submit</button>
<button formnovalidate>Save Draft</button>
</form>
Este padrão mantém a validação ativa para a submissão principal enquanto permite que os rascunhos a ignorem — sem precisar de novalidate no formulário.
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: