2
respostas

Não aparece mensagem de validação

Fiz todos os passos da primeira aula de validação de cpf mas quando eu coloco o cpf repetido não aparece a mensagem, a estilização acontece mas só a mensagem que não aparece, a mensagem das outras validações aparecem normalmente, segue código do javascript


export function valida(input) {
    const tipoDeInput = input.dataset.tipo

    if(validadores[tipoDeInput]) {
        validadores[tipoDeInput](input)
    }

    if(input.validity.valid) {
        input.parentElement.classList.remove('formulario__campo__div-erro')
        input.classList.remove('formulario__campo__div__input-erro')
        input.parentElement.querySelector('.formulario__campo__div__span--erro').innerHTML = ''
    } else {
        input.parentElement.classList.add('formulario__campo__div-erro')
        input.classList.add('formulario__campo__div__input-erro')
        input.parentElement.querySelector('.formulario__campo__div__span--erro').innerHTML = mostraMensagemDeErro(tipoDeInput, input)
    }
}

const tiposDeErro = [
    'valueMissing',
    'typeMismatch',
    'patternMismatch'
]

const mensagensDeErro = {
    nome: {
        valueMissing: 'O campo nome não pode estar vazio.'
    },
    cpf: {
        valueMissing: 'O campo cpf não pode estar vazio.',
        customError: 'O CPF digitado não é válido.'
    },
    email: {
        valueMissing: 'O campo email não pode estar vazio.',
        typeMismatch: 'O email digitado não é válido.'
    },
    senha: {
        valueMissing: 'O campo senha não pode estar vazio.',
        patternMismatch: 'A senha deve conter entre 6 a 12 carácteres, deve conter pelo menos uma letra maiúscula, uma letra minúscula, um número e não deve conter símbolos.'
    }
}  

const validadores = {
    cpf:input => validaCPF(input)
}

function mostraMensagemDeErro(tipoDeInput, input) {
    let mensagem = ''
    tiposDeErro.forEach(erro => {
        if(input.validity[erro]) {
            mensagem = mensagensDeErro[tipoDeInput][erro]
        }
    })
    return mensagem
}

function validaCPF(input) {
    const cpfFormatado = input.value.replace(/\D/g, '');
    let mensagem = ''

    if(!checaRepeticaoCPF(cpfFormatado)) {
        mensagem = 'O CPF digitado não é válido.';
    }

    input.setCustomValidity(mensagem)
}

function checaRepeticaoCPF(cpf) {
    const valoresRepetidos = [
        '00000000000',
        '11111111111',
        '22222222222',
        '33333333333',
        '44444444444',
        '55555555555',
        '77777777777',
        '88888888888',
        '99999999999'
    ]
    let cpfValido = true

    valoresRepetidos.forEach(valor => {
        if(valor == cpf) {
           cpfValido = false; 
        }
    })

    return cpfValido;
}
2 respostas

Tem como passar tambem o HTML? por conta desses varios inputs que esta usando, pode ser de onde a informacao esta sendo retirada, se tiver mais de um input precisaria ser mais especifico em qual deles estaria usando, ja no validaCPF existem elementos que so fazem sentido de serem corrigidos no js de acordo com botoes e campos que existem no HTML.

certo, vou colocar o html também

<section class="secao__formulario">
        <fieldset class="fieldset__formulario">
            <form class="form" >
                <div class="formulario">
                    <div class="formulario__legend">
                        <legend class="formulario__legend__texto">Cadastre-se</legend>
                    </div>
                    <div>
                        <div class="formulario__campo">
                            <label for="nomeInput" class="formulario__campo__label">Nome:</label>
                            <div class="formulario__campo__div">
                                <input type="text" class="formulario__campo__div__input" id="nomeInput" placeholder="Digite seu nome completo..." data-tipo="nome" required>
                                <span class="formulario__campo__div__span--erro"></span>
                            </div>
                        </div>
                        <div class="formulario__campo">
                            <label for="cpfInput" class="formulario__campo__label">CPF:</label>
                            <div class="formulario__campo__div">
                                <input type="number" class="formulario__campo__div__input" id="cpfInput" placeholder="Digite seu cpf..." size="11" data-tipo="cpf" required>
                                <span class="formulario__campo__div__span--erro"></span>
                            </div>
                        </div>
                        <div class="formulario__campo">
                            <label for="emailInput" class="formulario__campo__label">Email:</label>
                            <div class="formulario__campo__div ">
                                <input type="email" class="formulario__campo__div__input" id="emailInput"  placeholder="Digite seu email..." data-tipo="email" required>
                                <span class="formulario__campo__div__span--erro"></span> 
                            </div>
                        </div>
                        <div class="formulario__campo">
                            <label for="senhaInput" class="formulario__campo__label">Senha:</label>
                            <div class="formulario__campo__div">
                                <input type="password" class="formulario__campo__div__input" id="senhaInput" data-tipo="senha" placeholder="Crie uma senha..." 
                                pattern="^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).{4,8}$" required>
                                <span class="formulario__campo__div__span--erro"></span>
                            </div>
                        </div>
                        <div class="formulario__campo formulario__campo__cadastro">
                            <input type="submit" class="formulario__campo__submit" value="Cadastrar-se">
                        </div>
                        <div class="formulario__entrar">
                            <p class="formulario__entrar__p">Já tem conta? 
                            <a class="formulario__entrar__a" href="login">Entre aqui</a>
                            </p>
                        </div>
                    <div>
                </div>
            </form>
        </fieldset>
    </section>