← Fundamentos de HTML e CSS: estrutura, apresentação e diagnóstico
04 / 10 · 65 MIN

Restrições, feedback e acessibilidade

Interpretar restrições nativas e os limites de cada percurso de validação. Comunicar erros de forma utilizável e conservar as verificações do servidor.

Restrições expressas no HTML

O tipo do controlo define parte do contrato local. No exemplo, email verifica um formato e required exige um valor. Required é booleano: a sua presença mantém a exigência, mesmo quando o texto do atributo é false.

Para a retirar, remove o atributo. A forma como o browser apresenta a mensagem pode variar. O resultado continua limitado às restrições locais e não confirma a existência da caixa de correio ou a autorização para pedir capacidade.

Intervalo e alinhamento

O input numérico admite uma grelha: começa em 2 e avança de 2 em 2 até 10. O valor 3 não está fora dos limites, mas falha o alinhamento de step. São diagnósticos diferentes, com correções diferentes.

Se a regra de negócio permitir qualquer número no intervalo, a configuração deve refletir essa política; não se deve retirar uma restrição apenas porque um exemplo falhou. O servidor deve aplicar o mesmo contrato relevante.

Uma mensagem personalizada tem estado

setCustomValidity permite representar uma regra adicional através de uma mensagem não vazia. Essa mensagem conserva o erro até ser limpa. Quando a condição deixa de falhar, chama setCustomValidity com string vazia; escrever OK ou válido mantém precisamente um erro personalizado.

Numa relação entre dois campos, volta a avaliar a regra quando qualquer dependência relevante muda. Limpar esse erro não dispensa as restantes restrições do controlo ou as regras do servidor.

O percurso de validação importa

checkValidity devolve um resultado sobre as restrições aplicáveis; reportValidity também apresenta as falhas ao utilizador. Uma submissão normal pode desencadear validação interativa, mas novalidate e certos percursos alteram esse comportamento.

Um valor atribuído por código não recebe necessariamente as mesmas verificações de edição humana: minlength e maxlength não são verificados para atribuições programáticas nesse percurso, mesmo chamando estas APIs. Valida importações explicitamente segundo o contrato.

Iniciar submissão por código

requestSubmit segue o percurso de um submitter, respeitando as condições de validação e o evento submit. submit direto omite a validação de restrições e não dispara esse evento. Se um atalho de teclado tem de conservar o comportamento do botão visível, a diferença é decisiva.

Construir FormData apenas prepara dados; não prova que houve envio. Na interpretação de um excerto, identifica a chamada concreta antes de concluir que todas as etapas foram percorridas.

Erro localizável e corrigível

Uma mensagem útil identifica o campo e explica o que deve mudar. Depois de uma submissão com falhas, um resumo com ligações aos controlos pode ajudar a recuperar o contexto. Associa descrições aos campos e considera colocar foco no primeiro erro, sem o deslocar repetidamente enquanto a pessoa corrige outro campo. aria-invalid comunica um estado de erro às tecnologias de apoio; não substitui a regra que decide aceitar ou recusar a operação.

Aceitação completa da operação

Uma indicação visual de válido pode significar apenas que as restrições conhecidas do browser passaram. A API ainda pode recusar o pedido por falta de capacidade ou conflito com dados atuais. Preserva a distinção no feedback: não mostres uma operação como concluída antes de receber evidência desse resultado.

Ao responder aos casos, explica a regra, o percurso e a observação disponível. A avaliação exige interpretar essas relações; não executar código ou contactar um servidor.

<form action="/pedidos/capacidade" method="post">
  <label for="contacto">Email de contacto</label>
  <input id="contacto" name="contacto" type="email" required
         aria-describedby="contacto-ajuda">
  <p id="contacto-ajuda">Indica o email para receber a decisão.</p>
  <label for="unidades">Unidades</label>
  <input id="unidades" name="unidades" type="number"
         min="2" max="10" step="2" required aria-describedby="unidades-ajuda">
  <p id="unidades-ajuda">Escolhe 2, 4, 6, 8 ou 10 unidades.</p>
  <button type="submit">Pedir capacidade</button>
</form>
NA PRÁTICA

O form fictício exige email e um número de unidades. Três unidades estão entre 2 e 10, mas violam step. A aceitação do formato de email não prova a existência da caixa.

A marcação fornece ajuda associada; não inclui o servidor, resposta de erro nem persistência. A regra de capacidade real teria de ser confirmada no endpoint.

Armadilhas comuns

Usar required="false" como desativação; tratar formato de email como prova de identidade; deixar setCustomValidity com texto positivo; confiar em maxlength numa atribuição programática; esperar que aria-invalid impeça o envio; substituir mensagens por cor.

Tópicos relacionados: Formulários, controlos e submissão · Foco, estados, movimento e preferências · Diagnóstico de estilos e entrega

Leva esta ideia contigo

Cada verificação tem um âmbito. A validação nativa ajuda durante a interação, o feedback explica como corrigir e o servidor decide a aceitação real. Mantém os três ligados ao mesmo contrato e identifica explicitamente os caminhos que omitem etapas.

Criar conta

Referência: Client validation and server acceptance · HTML Living Standard; modular CSS