DEV Community

Cover image for Validação e Formatação de Formulários: Client-Side vs. Server-Side
Elisangela Silva
Elisangela Silva

Posted on • Edited on

5 2

Validação e Formatação de Formulários: Client-Side vs. Server-Side

Artigo atualizado dia 22/03/2025

Olá, pessoal!

Hoje vamos explorar um pouco sobre validação e formatação de dados no client-side (navegador) e no server-side (servidor).

Este artigo presume que você já conhece o básico de HTML e JavaScript. Caso não, deixei dois links para você começar sua jornada.

Em alguns momentos, utilizarei Expressões Regulares (regex). Se você não está familiarizado com o conceito, recomendo este artigo:


Sumário

  1. Introdução
  2. Campo que permite apenas letras
  3. Campo para e-mail
  4. Campo para CPF
  5. Campo para data de nascimento
  6. Campo para celular e telefone fixo
  7. Campo para observação
  8. Conclusão
  9. Código completo no Codepen

Introdução

Para ilustrar os conceitos, vamos utilizar um formulário simples. Comecei criando um rascunho no Figma, uma ferramenta incrível para design de interfaces. Confira o resultado:

Rascunho do formulário no Figma

Rascunho do formulário criado no Figma.

Agora, vamos implementar as validações e formatações!


1. Campo que permite apenas letras

Começaremos pelo campo Nome, que deve aceitar apenas letras. Existem duas abordagens para isso:

Opção 1: Usando o atributo pattern do HTML

O atributo pattern permite validar o valor de um campo usando uma expressão regular. Ele funciona com inputs do tipo text, email, tel, entre outros.

<form action="#">
  <label for="nome">Nome:</label>
  <input type="text" id="nome" pattern="[A-Za-zÀ-ú\s]+" placeholder="Apenas letras" required>
  <input type="submit">
</form>
Enter fullscreen mode Exit fullscreen mode
  • [A-Za-zÀ-ú\s]+: Aceita letras maiúsculas, minúsculas, acentuadas e espaços.
  • required: Garante que o campo não seja enviado vazio.

Quando o usuário tenta enviar o formulário com dados inválidos, uma mensagem de erro é exibida:

Mensagem de erro ao enviar dados inválidos

Opção 2: Bloqueando números com JavaScript

Outra abordagem é impedir que números sejam digitados no campo. Para isso, usamos o evento keydown:

<input type="text" id="nome" class="nomeClient" placeholder="Apenas letras">
Enter fullscreen mode Exit fullscreen mode
let inputNome = document.querySelector(".nomeClient");
inputNome.addEventListener("keydown", function(e) {
  if (e.key >= "0" && e.key <= "9") {
    e.preventDefault(); // Bloqueia a tecla pressionada
  }
});
Enter fullscreen mode Exit fullscreen mode

2. Campo para e-mail

Para validar e-mails, podemos usar o atributo type="email" do HTML. Ele verifica se o valor contém um @ e um domínio válido.

<label for="email">E-mail:</label>
<input type="email" id="email" placeholder="exemplo@dominio.com" required>
Enter fullscreen mode Exit fullscreen mode

Se o e-mail for inválido, o navegador exibe uma mensagem de erro:

Mensagem de erro para e-mail inválido

Observação: A validação no client-side é útil para melhorar a experiência do usuário, mas nunca substitui a validação no server-side.


3. Campo para CPF

A validação de CPF envolve três etapas:

  1. Bloquear letras e caracteres especiais.
  2. Verificar se o CPF tem 11 dígitos.
  3. Validar o CPF usando o algoritmo da Receita Federal.

Código Completo para CPF

<label for="cpf">CPF:</label>
<input type="text" id="cpf" placeholder="Apenas números" required>
<span id="erro_cpf" class="mensagem-erro" style="display: none;">CPF inválido!</span>
Enter fullscreen mode Exit fullscreen mode
let campoCPF = document.querySelector("#cpf");

campoCPF.addEventListener("keydown", function(e) {
  if (e.key >= "a" && e.key <= "z") {
    e.preventDefault(); // Bloqueia letras
  }
});

campoCPF.addEventListener("blur", function() {
  let cpf = this.value.replace(/\D/g, ""); // Remove não dígitos

  if (cpf.length === 11 && validarCPF(cpf)) {
    let cpfFormatado = cpf.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, "$1.$2.$3-$4");
    this.value = cpfFormatado;
    document.getElementById("erro_cpf").style.display = "none";
  } else {
    document.getElementById("erro_cpf").style.display = "block";
  }
});

function validarCPF(cpf) {
  // Implementação do algoritmo da Receita Federal
  // (Código omitido para brevidade)
}
Enter fullscreen mode Exit fullscreen mode

4. Campo para data de nascimento

Para o campo de data de nascimento, podemos usar o tipo date do HTML, que já inclui uma validação básica.

<label for="data_nascimento">Data de Nascimento:</label>
<input type="date" id="data_nascimento" required>
Enter fullscreen mode Exit fullscreen mode

5. Campo para celular e telefone fixo

Para telefones, usamos o atributo maxlength para limitar o número de caracteres e regex para formatação.

<label for="celular">Celular:</label>
<input type="text" id="celular" placeholder="Apenas números" maxlength="11" required>

<label for="telefone">Telefone Fixo:</label>
<input type="text" id="telefone" placeholder="Apenas números" maxlength="10" required>
Enter fullscreen mode Exit fullscreen mode
// Formatação para celular
document.querySelector("#celular").addEventListener("blur", function() {
  let numero = this.value.replace(/\D/g, "");
  if (numero.length === 11) {
    this.value = numero.replace(/(\d{2})(\d{5})(\d{4})/, "($1) $2-$3");
  }
});

// Formatação para telefone fixo
document.querySelector("#telefone").addEventListener("blur", function() {
  let numero = this.value.replace(/\D/g, "");
  if (numero.length === 10) {
    this.value = numero.replace(/(\d{2})(\d{4})(\d{4})/, "($1) $2-$3");
  }
});
Enter fullscreen mode Exit fullscreen mode

6. Campo para observação

Para campos de texto longo, usamos a tag <textarea>:

<label for="observacao">Observação:</label>
<textarea id="observacao" placeholder="Limite de 100 caracteres" maxlength="100"></textarea>
Enter fullscreen mode Exit fullscreen mode

Conclusão

Neste artigo, exploramos como validar e formatar dados no client-side usando HTML e JavaScript. Lembre-se de que a validação no client-side é importante para melhorar a experiência do usuário, mas nunca deve substituir a validação no server-side, que garante a segurança e integridade dos dados.

Confira o código completo no Codepen:

Ver código no Codepen

Se tiver dúvidas, sugestões ou críticas, deixe um comentário abaixo.

Heroku

Deploy with ease. Manage efficiently. Scale faster.

Leave the infrastructure headaches to us, while you focus on pushing boundaries, realizing your vision, and making a lasting impression on your users.

Get Started

Top comments (2)

Collapse
 
biahdev profile image
Ana Beatriz

Obrigado!! Ajudou bastante

Collapse
 
anataliacandido profile image

Olá Elisangela, tudo bem?
o meu código está dando um erro, o seu deu esse erro também?

index.js:4 Uncaught TypeError: Cannot read properties of null (reading'addEventListener')
at index.js:4:11
index.html

form>
            <div  style="width: 400px; margin: 200px auto;">
                <label>CPF</label>
                <input type= "text" id="campo_cpf" requerid>
                <input type="submit">
            </div>

Enter fullscreen mode Exit fullscreen mode

index.js


let value_cpf = document.querySelector('#campo_cpf');

value_cpf.addEventListener("keydown", function(e){
    if(e.kay > "a" && e.kay < "z"){
        e.preventDefault();
    }
});

value_cpf.addEventListener("blur", function(e){
    let validar_cpf = this.value.replace(/\D/g,"");

    if(validar_cpf.length == 11){

        var Soma;
        var Resto;

        Soma = 0;
        for (i = 1; i <= 9; i++) Soma = Soma + parseInt(validar_cpf.substring(i-1, i)) * (11 - i);
         Resto = (Soma * 10) % 11;

        if ((Resto == 10) || (Resto == 11)) Resto = 0;
        if (Resto != parseInt(validar_cpf.substring(9, 10))) return alert("CPF Inválido");;

        Soma = 0;
        for (i = 1; i <= 10; i++) Soma = Soma + parseInt(validar_cpf.substring(i-1, i)) * (12 - i);
        Resto = (Soma * 10) % 11;

        if ((Resto == 10) || (Resto == 11)) Resto = 0;
        if (Resto != parseInt(validar_cpf.substring(10, 11))) return alert("CPF Inválido!");;

        cpf_final = validar_cpf.replace( /(\d{3}) (\d)/ , "$1.$2");
        cpf_final = cpf_final.replace(/(\d{3}) (\d)/ , "$1.$2");
        cpf_final = cpf_final.replace(/(\d{3})(\d{1,2})$/ , "$1-$2");
        document.getElementById('campo_cpf').value = cpf_final;
    }
     else{
        alert("CPF INVÁLIDO! digite 11 digitos numérios");
    }
});
Enter fullscreen mode Exit fullscreen mode

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

👋 Kindness is contagious

If you found this post useful, consider leaving a ❤️ or a nice comment!

Got it