Reparei que se você errar o CPF, colocar algo inválido, ele não deixa você corrigir, mesmo colocando meu CPF corretamente ele diz que está inválido. Ai tenho que atualizar a página e preencher novamente o formulário. Seria um bug no código ou tem algo errado no meu código?
// Estrutura de validação de CPF
function validaCPF(input) {
const cpfFormatado = input.value.replace(/\D/g, '')
let mensagem = ''
if(!checaCPFRepetido(cpfFormatado) || !checaEstruturaCPF(cpfFormatado)) {
mensagem = 'O CPF digitado não é válido'
}
input.setCustomValidity(mensagem)
}
function checaCPFRepetido(cpf) {
const valoresRepetidos = [
'00000000000',
'11111111111',
'22222222222',
'33333333333',
'44444444444',
'55555555555',
'66666666666',
'77777777777',
'88888888888',
'99999999999'
]
let cpfValido = true
valoresRepetidos.forEach(valor => {
if(valor == cpf) {
cpfValido = false
}
})
return cpfValido
}
function checaEstruturaCPF(cpf) {
const multiplicador = 10
return checaDigitoVerificador(cpf, multiplicador)
}
function checaDigitoVerificador(cpf, multiplicador) {
if (multiplicador >= 12) {
return true
}
let multiplicadorInicial = multiplicador
let soma = 0
const cpfSemDigitos = cpf.substr(0, multiplicador - 1).split('')
const checaDigitoVerificador = cpf.charAt(multiplicador - 1)
for(let contador = 0; multiplicadorInicial > 1; multiplicadorInicial--) {
soma = soma + cpfSemDigitos[contador] * multiplicadorInicial
contador++
}
if(checaDigitoVerificador == confirmaDigito(soma)) {
return checaDigitoVerificador(cpf, multiplicador + 1)
}
return false
}
function confirmaDigito(soma) {
return 11 - (soma % 11)
}