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

Formulários, controlos e submissão

Interpretar a associação de controlos, os pares submetidos e a influência do botão escolhido. Distinguir identidade, nome, estado e propriedade do formulário.

Três relações diferentes

O id identifica um elemento no documento, o for de label referencia esse id e name dá nome à entrada submetida. No exemplo, resumo desempenha os dois papéis por conveniência, mas os valores não têm de coincidir. Se um componente mudar o id para evitar duplicados, deve atualizar o label correspondente; não precisa de mudar a chave que o servidor espera. Um placeholder não substitui esta identificação persistente.

Controlos que participam

Um controlo pode estar visível e não contribuir para os dados. Um input de texto sem name não fornece essa entrada e um controlo disabled é excluído. Readonly, nos tipos que o suportam, impede edição direta mas pode conservar o valor na submissão.

Isso é útil para apresentar um código fixo, porém não garante a integridade do pedido: o servidor deve confirmar a identidade do registo e o direito a alterá-lo.

Ausência também tem significado

A checkbox avisos do exemplo só envia o par avisos=email quando está marcada. Desmarcada, não envia automaticamente false, zero ou uma string vazia. A aplicação deve definir como interpreta a ausência.

Numa edição parcial, ausência pode significar não alterar; numa substituição completa, pode significar desativar. Essa decisão pertence ao contrato da operação e não deve ser adivinhada a partir da aparência do controlo.

Intenção do botão

Ajuda usa type button para não acrescentar submissão nem reset à interação. Os dois submitters têm valores distintos e o de rascunho substitui o destino do form com formaction. A validação continua ativa porque não existe uma dispensa no exemplo.

Ao interpretar FormData construído por código, considera o parâmetro submitter se o seu name/value for necessário. Construir esse objeto não é, por si só, um pedido HTTP.

Propriedade e posição visual

O atributo form de um input pode associá-lo a um formulário do mesmo documento, mesmo fora desse elemento. A associação usa o id do form. Mas form num fieldset não é uma regra herdada por todos os inputs: cada controlo precisa da associação adequada.

Isto importa quando um painel lateral parece fazer parte da mesma edição, mas está colocado noutra zona do DOM. Revê propriedade e nomes, além da proximidade visual.

Grupos e desativação

fieldset e legend permitem agrupar controlos relacionados com um título comum. Disabled no fieldset desativa os controlos descendentes, com a exceção dos descendentes do seu primeiro legend filho. Essa exceção pode permitir um controlo que decide ativar o grupo, mas a lógica de ativação não surge automaticamente.

Um segundo estado disabled independente continua relevante. Não generalizes a exceção a todos os elementos legend ou a todos os grupos aninhados.

Contrato de entrega

GET coloca os dados no URL e é adequado a pesquisas sem efeitos de escrita; POST transporta-os no corpo com a codificação aplicável. Nenhum método comprova que os dados sejam válidos, autorizados ou cifrados pelo simples facto de ter sido escolhido.

Para diagnosticar uma falha, identifica controlo, par esperado, submitter, método e destino. Só depois compara a resposta. As perguntas pedem essa leitura do fluxo, sem executar os excertos.

<form id="pedido" action="/pedidos" method="post">
  <label for="codigo">Código do registo</label>
  <input id="codigo" name="codigo" type="text" value="R7" readonly>
  <fieldset>
    <legend>Informação do pedido</legend>
    <label for="resumo">Resumo</label>
    <input id="resumo" name="resumo" type="text" required>
    <label><input name="avisos" type="checkbox" value="email"> Receber avisos</label>
  </fieldset>
  <button type="button">Ajuda</button>
  <button type="submit" name="intencao" value="enviar">Enviar</button>
  <button type="submit" name="intencao" value="rascunho"
          formaction="/pedidos/rascunho">Guardar rascunho</button>
</form>
NA PRÁTICA

O form fictício inclui o código readonly nos dados, exige resumo e só envia avisos quando a checkbox está marcada. O submitter distingue enviar de rascunho e este último altera o destino. Não há dispensa de validação para o rascunho.

Ajuda é um botão sem ação implementada no excerto; os endpoints são ilustrativos e não fornecem persistência nem autorização.

Armadilhas comuns

Confundir for com name; enviar campos disabled por expectativa; tratar checkbox desmarcada como false automático; supor que form no fieldset é herdado; ignorar formaction; confiar num código só porque está readonly.

Tópicos relacionados: Restrições, feedback e acessibilidade · Estrutura do documento e semântica · Diagnóstico de estilos e entrega

Leva esta ideia contigo

A submissão resulta de controlos associados, nomes, estados e submitter. Prevê esses fatores antes de atribuir um valor em falta ao servidor. O contrato de dados e a autorização continuam a exigir verificação do lado do servidor.

Criar conta

Referência: Native form delivery · HTML Living Standard; modular CSS