3
respostas

Validando inputs no form

Oi pessoal. Criei dois arquivos de validação pra um site, um mostrando quais campos não foram validados ao pressionar o botão enviar e outro contendo os padrões necessários para que o campo seja válido. Eles funcionam bem separadamente, mas quando tento usar ambos na mesma página apenas um funciona e o outro não. Será que eles são mutuamente exclusivos? O input-validation.js é um exemplo de validação que encontrei aqui (https://www.sitepoint.com/instant-validation/), não entendo tudo o que o código faz mas decidi usar já que ainda não domino bem essa parte. Se não tiver jeito deles funcionarem juntos, qual seria a melhor alternativa pra fazer essas validações? Muito obrigada!

form.js

var contact = document.querySelector("#send");
 contact.addEventListener("click", function(event) {
    event.preventDefault();

    var erros = validateForm(contact);
    console.log(erros);

    if(erros.length > 0) {
        exibeErro(erros);
        return;
    }

    var errorMessage = document.querySelector("#error-message");
    errorMessage.innerHTML = "";
})

function exibeErro(erros){
    var ul = document.querySelector("#error-message");
    ul.innerHTML = "";

    erros.forEach(function(erro){
        var li = document.createElement("li");
        li.textContent = erro;
        ul.appendChild(li);
    });
}

function validateForm(contact) {

    var erros = [];

    if (document.forms["contactForm"]["name"].value == "") {
        erros.push("Name must be filled out");
    }

    if (document.forms["contactForm"]["email"].value == "") {
        erros.push("Email must be filled out");
    }

    if (document.forms["contactForm"]["msg"].value == "") {
        erros.push("Message cannot be blank");
    }

    return erros;
}

input-validation.js

function addEvent(node, type, callback) {
  if (node.addEventListener) {
    node.addEventListener(
      type,
      function(e) {
        callback(e, e.target);
      },
      false
    );
  } else if (node.attachEvent) {
    node.attachEvent("on" + type, function(e) {
      callback(e, e.srcElement);
    });
  }
}

//identify whether a field should be validated
//ie. true if the field is neither readonly nor disabled,
//and has either "pattern", "required" or "aria-invalid"
function shouldBeValidated(field) {
  return (
    !(field.getAttribute("readonly") || field.readonly) &&
    !(field.getAttribute("disabled") || field.disabled) &&
    (field.getAttribute("pattern") || field.getAttribute("required"))
  );
}

//field testing and validation function
function instantValidation(field) {
  //if the field should be validated
  if (shouldBeValidated(field)) {
    //the field is invalid if:
    //it's required but the value is empty
    //it has a pattern but the (non-empty) value doesn't pass
    var invalid =
      (field.getAttribute("required") && !field.value) ||
      (field.getAttribute("pattern") &&
        field.value &&
        !new RegExp(field.getAttribute("pattern")).test(field.value));
    //add or remove the attribute is indicated by
    //the invalid flag and the current attribute state
    if (!invalid && field.getAttribute("aria-invalid")) {
      field.removeAttribute("aria-invalid");
    } else if (invalid && !field.getAttribute("aria-invalid")) {
      field.setAttribute("aria-invalid", "true");
    }
  }
}
//now bind a delegated change event
//== THIS FAILS IN INTERNET EXPLORER <= 8 ==//
//addEvent(document, 'change', function(e, target)
//{
//  instantValidation(target);
//});
//now bind a change event to each applicable for field
var fields = [
  document.getElementsByTagName("input"),
  document.getElementsByTagName("textarea")
];
for (var a = fields.length, i = 0; i < a; i++) {
  for (var b = fields[i].length, j = 0; j < b; j++) {
    addEvent(fields[i][j], "change", function(e, target) {
      instantValidation(target);
    });
  }
}

contact.html

        <form action="#" method="get" name="contactForm" autocomplete="on">
                <fieldset>
                    <label for="name" title="Required">Name</label>
                    <input type="text" id="name" name="name" autofocus required="required"
                            aria-required="true" 
                            pattern="^([- \w\d\u00c0-\u024f]+)$"
                            size="20"
                            spellcheck="false"
                            value="">
                    <label for="email" title="Required">Email</label>
                    <input type="text" id="email" name="email" required="required"
                            aria-required="true"
                            pattern="^(([-\w\d]+)(\.[-\w\d]+)*@([-\w\d]+)(\.[-\w\d]+)*(\.([a-zA-Z]{2,5}|[\d]{1,3})){1,2})$" 
                            size="30"
                            spellcheck="false"
                            value="">
                </fieldset>
                <fieldset>
                    <label for="msg" title="Required" autocomplete="off">Message</label>
                    <textarea id="msg" name="message" cols="60" rows="10" placeholder="Type your message here"
                            required="required"
                            aria-required="true"
                            spellcheck="true"></textarea>
                    <ul id="error-message"></ul>
                    <button id="send" type="submit">Send</button>
                </fieldset>
3 respostas

Fala ai Bruna, tudo bem? Olhando esse monte de código fica complicado.

Posso te pedir um favor? Consegue compartilhar o projeto completo? Assim da para eu subir ele e testar por aqui com mais calma.

Pode compartilhar através do Github ou Google Drive (zipado).

Fico no aguardo.

Oi! Está tudo aqui https://github.com/specella/messora

Nos últimos dias eu consegui fazer os dois códigos funcionarem no teste.html mas ainda queria melhorar a validação, como mostrar uma mensagem caso o usuário insira um caractere inválido. Ainda não domino o código escrito no arquivo teste.js pra saber o que alterar. Obrigada pela ajuda!

Fala ai Bruna, tudo bem? Fiz os testes por aqui e funcionou certinho o formulário de contato (acredito ser ele o alvo).

Mostrou as mensagens de validação e quando os campos foram preenchidos nenhum erro foi alertado.

Abraços e bons estudos.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software