Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Como faço para colocar bordas no campo quando a há erro?

Gostaria de trocar a cor da borda, juntamente quando aparece a mensagem de erro nos campos. Consegui aplicar, mas depois que o campo está com os dados corretos, a borda continua...

No arquivo script. js, adicionei o addEventListener no forEach do camposDoFormulário, linha 25:

import ehUmCPF from "./valida-cpf.js";
import ehMaiorDeIdade from "./valida-idade.js";
const camposDoFormulario = document.querySelectorAll("[required]");
const formulario = document.querySelector("[data-formulario]")

formulario.addEventListener("submit", (e) => {
    e.preventDefault();

    const listaRespostas = {
        "nome": e.target.elements["nome"].value,
        "email": e.target.elements["email"].value,
        "rg": e.target.elements["rg"].value,
        "cpf": e.target.elements["cpf"].value,
        "aniversario": e.target.elements["aniversario"].value,
    }

    localStorage.setItem("cadastro", JSON.stringify(listaRespostas));

    window.location.href = './abrir-conta-form-2.html';
})

camposDoFormulario.forEach((campo) => {
    campo.addEventListener("blur", () => verificaCampo(campo));
    campo.addEventListener('invalid', evento => evento.preventDefault());
    campo.addEventListener("invalid", () => campo.style.border = "2px solid red"); 
 
})

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

const mensagens = {
    nome: {
        valueMissing: "O campo de nome não pode estar vazio.",
        patternMismatch: "Por favor, preencha um nome válido.",
        tooShort: "Por favor, preencha um nome válido."
    },
    email: {
        valueMissing: "O campo de e-mail não pode estar vazio.",
        typeMismatch: "Por favor, preencha um email válido.",
        tooShort: "Por favor, preencha um e-mail válido."
    },
    rg: {
        valueMissing: "O campo de RG não pode estar vazio.",
        patternMismatch: "Por favor, preencha um RG válido.",
        tooShort: "O campo de RG não tem caractéres suficientes."
    },
    cpf: {
        valueMissing: 'O campo de CPF não pode estar vazio.',
        patternMismatch: "Por favor, preencha um CPF válido.",
        customError: "O CPF digitado não existe.",
        tooShort: "O campo de CPF não tem caractéres suficientes."
    },
    aniversario: {
        valueMissing: 'O campo de data de nascimento não pode estar vazio.',
        customError: 'Você deve ser maior que 18 anos para se cadastrar.'
    },
    termos: {
        valueMissing: 'Você deve aceitar nossos termos antes de continuar.',
    }
}

function verificaCampo(campo) {
    let mensagem = "";
    campo.setCustomValidity('');
    if (campo.name == "cpf" && campo.value.length >= 11) {
        ehUmCPF(campo);
    }
    if(campo.name == "aniversario" && campo.value != "") {
        ehMaiorDeIdade(campo);
    }
    tiposDeErro.forEach(erro => {
        if (campo.validity[erro]) {
            mensagem = mensagens[campo.name][erro];
            console.log(mensagem);
        }
    })
    const mensagemErro = campo.parentNode.querySelector('.mensagem-erro');
    const validadorDeInput = campo.checkValidity();

    if(!validadorDeInput) {
        mensagemErro.textContent = mensagem;
    } else {
        mensagemErro.textContent = "";
    }
}
2 respostas
solução!

Olá, Daissa!

Pelo código que você compartilhou, parece que você já está no caminho certo para trocar a cor da borda quando há um erro nos campos do formulário. No entanto, você mencionou que a borda continua mesmo depois que o campo está com os dados corretos.

Uma possível solução para esse problema é adicionar uma lógica no evento "blur" do campo para remover a borda vermelha quando o campo estiver válido. Você pode fazer isso adicionando a seguinte linha de código dentro do evento "blur":

campo.addEventListener("blur", () => {
    verificaCampo(campo);
    if (campo.checkValidity()) {
        campo.style.border = "";
    }
});

Ficando assim sua função camposDoFormulario.forEach((campo) => no arquivo script.js:

camposDoFormulario.forEach((campo) => {
    campo.addEventListener("blur", () => {
        verificaCampo(campo);
        if (campo.checkValidity()) {
            campo.style.border = "";
        }
    });
    campo.addEventListener('invalid', evento => evento.preventDefault());
    campo.addEventListener("invalid", () => campo.style.border = "2px solid red"); 
 
})

Dessa forma, quando o campo perder o foco, a função "verificaCampo" será chamada para verificar se há erros no campo. Em seguida, verificamos se o campo está válido usando o método "checkValidity()". Se estiver válido, removemos a borda vermelha atribuindo uma string vazia ao estilo da borda.

Com esse código obtive o seguinte resultado:

Mostrando o projeto, funcionando corretamente

Espero ter ajudado e reforço que em casos de dúvidas, conte sempre com o fórum da comunidade Alura! Bons estudos!

Sucesso

Um grande abraço e até mais!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Muito obrigada Victor, sua resposta me ajudou bastante.