 
08/02/2024

Validar CPF em formulários é uma tarefa importante e ajuda a manter a precisão dos dados. Este artigo demonstra como criar um campo de entrada que valida e formata CPFs utilizando HTML e JavaScript.
Para criar um campo de entrada de CPF no formulário, utilizaremos a tag <input> com o tipo "text":
<form id="cpfForm">
  <label for="cpf">CPF:</label>
  <input type="text" id="cpf" name="cpf">
  <input type="submit" value="Enviar">
</form>
Para garantir que o CPF tenha o formato correto 999.999.999-99, o script abaixo formata os dígitos enquanto os caracteres são digitados no campo:
document.getElementById('cpf').addEventListener('input', function(e) {
  var value = e.target.value;
  var cpfPattern = value.replace(/\D/g, '') // Remove qualquer coisa que não seja número
						.replace(/(\d{3})(\d)/, '$1.$2') // Adiciona ponto após o terceiro dígito
						.replace(/(\d{3})(\d)/, '$1.$2') // Adiciona ponto após o sexto dígito
						.replace(/(\d{3})(\d)/, '$1-$2') // Adiciona traço após o nono dígito
						.replace(/(-\d{2})\d+?$/, '$1'); // Impede entrada de mais de 11 dígitos
  e.target.value = cpfPattern;
});
Para validar o CPF antes de permitir o envio do formulário, utilizaremos uma função de validação a validade calculando os dígitos verificadores.
function validaCPF(cpf) {
  cpf = cpf.replace(/\D+/g, '');
  if (cpf.length !== 11) return false;
  let soma = 0;
  let resto;
  if (/^(\d)\1{10}$/.test(cpf)) return false; // Verifica sequências iguais
  for (let i = 1; i <= 9; i++) soma += parseInt(cpf.substring(i-1, i)) * (11 - i);
  resto = (soma * 10) % 11;
  if ((resto === 10) || (resto === 11)) resto = 0;
  if (resto !== parseInt(cpf.substring(9, 10))) return false;
  soma = 0;
  for (let i = 1; i <= 10; i++) soma += parseInt(cpf.substring(i-1, i)) * (12 - i);
  resto = (soma * 10) % 11;
  if ((resto === 10) || (resto === 11)) resto = 0;
  if (resto !== parseInt(cpf.substring(10, 11))) return false;
  return true;
}
document.getElementById('cpfForm').addEventListener('submit', function(e) {
  var cpf = document.getElementById('cpf').value;
  if (!validaCPF(cpf)) {
	e.preventDefault(); // Impede o envio do formulário
	alert('CPF inválido. Verifique o número digitado.');
	document.getElementById('cpf').focus(); // Foca no campo de CPF após o erro
  }
});
Para melhorar a experiência do usuário, o campo de CPF receberá automaticamente o foco caso o número inserido seja inválido.
Juntamos todos os conceitos apresentados até agora em um único código que formata e valida o número de CPF:
<form id="cpfForm">
	<label for="cpf">CPF:</label>
	<input type="text" id="cpf" name="cpf">
	<input type="submit" value="Enviar">
</form>
<script>
function validaCPF(cpf) {
	cpf = cpf.replace(/\D+/g, '');
	if (cpf.length !== 11) return false;
	let soma = 0;
	let resto;
	if (/^(\d)\1{10}$/.test(cpf)) return false;
	for (let i = 1; i <= 9; i++) soma += parseInt(cpf.substring(i-1, i)) * (11 - i);
	resto = (soma * 10) % 11;
	if ((resto === 10) || (resto === 11)) resto = 0;
	if (resto !== parseInt(cpf.substring(9, 10))) return false;
	soma = 0;
	for (let i = 1; i <= 10; i++) soma += parseInt(cpf.substring(i-1, i)) * (12 - i);
	resto = (soma * 10) % 11;
	if ((resto === 10) || (resto === 11)) resto = 0;
	if (resto !== parseInt(cpf.substring(10, 11))) return false;
	return true;
}
document.addEventListener('DOMContentLoaded', function() {
	document.getElementById('cpfForm').addEventListener('submit', function(e) {
		var cpf = document.getElementById('cpf').value;
		if (!validaCPF(cpf)) {
			e.preventDefault();
			alert('CPF inválido. Verifique o número digitado.');
			document.getElementById('cpf').focus();
		}
	});
	document.getElementById('cpf').addEventListener('input', function(e) {
		var value = e.target.value;
		var cpfPattern = value.replace(/\D/g, '')
							  .replace(/(\d{3})(\d)/, '$1.$2')
							  .replace(/(\d{3})(\d)/, '$1.$2')
							  .replace(/(\d{3})(\d)/, '$1-$2')
							  .replace(/(-\d{2})\d+?$/, '$1');
		e.target.value = cpfPattern;
	});
});
</script>
Lembre-se de que a validação JavaScript é apenas uma etapa do processo. Você precisa implementar as mesmas validações no script ou aplicativo que recebe os dados no servidor, garantindo a validade dos dados processados.