Ver Mensaje Individual
  #5 (permalink)  
Antiguo 15/06/2014, 18:50
Avatar de nanotime
nanotime
 
Fecha de Ingreso: noviembre-2011
Ubicación: Cd. Guayana
Mensajes: 145
Antigüedad: 12 años, 5 meses
Puntos: 6
Respuesta: Caso interesante con validación de formularios

Pues hice un par de cambios en el JS y dejo entonces el html:

Código HTML:
Ver original
  1. <!DOCTYPE html>
  2.   <head>
  3.     <meta charset="utf-8">
  4.     <title>Webform</title>
  5.     <link rel="stylesheet" href="css/style.css">
  6.     <script src="js/main.js"></script>
  7.   </head>
  8.   <body>
  9.     <header>
  10.       <h2>Wellcome!</h2>
  11.     </header>
  12.     <section class="form-wrapper">
  13.       <form name="welcome" method="post">
  14.         <div class="fields">
  15.           <div class="field">
  16.             <label for="fname">Name:</label>
  17.             <input type="text" name="fname" placeholder="your name here" pattern="[A-Za-z]" required>
  18.             <div id="name-err"></div>
  19.           </div>
  20.           <div class="field">
  21.             <label for="lname">Last name:</label>
  22.             <input type="text" name="lname" placeholder="your lastname here" pattern="[A-Za-z]" required>
  23.             <div id="lname-err"></div>
  24.           </div>
  25.           <div class="field">
  26.             <label for="age">Age:</label>
  27.             <input type="text" name="age" placeholder="your age here" pattern="[0-9]">
  28.             <div id="age-err"></div>
  29.           </div>
  30.           <div class="field">
  31.             <label for="mail">Email:</label>
  32.             <input type="text" name="email" placeholder="[email protected]" required>
  33.             <div id="mail-err"></div>
  34.           </div>
  35.           <div class="radios"><span>Sex:</span>
  36.             <input type="radio" name="male" value="male"><span>Male</span>
  37.             <input type="radio" name="female" value="female"><span>Female</span>
  38.           </div>
  39.           <div class="text">
  40.             <textarea name="message"></textarea>
  41.           </div>
  42.           <div class="button-wrapper">
  43.             <input type="button" name="send" value="Send" class="button-send">
  44.           </div>
  45.         </div>
  46.       </form>
  47.     </section>
  48.   </body>
  49. </html>

Ahora, el JS:

Código Javascript:
Ver original
  1. function init() {
  2.   document.welcome.addEventListener('invalid', validate, true);
  3.   document.querySelector('.button-send').addEventListener('click', send, false);
  4. }
  5.  
  6. function validate(e) {
  7.   var el = e.target;
  8.  
  9.   var elem = {
  10.     name : document.querySelector("input[name='fname']"),
  11.     lname: document.querySelector("input[name='lname']"),
  12.     age  : document.querySelector("input[name='age']"),
  13.     mail : document.querySelector("input[name='mail']")
  14.   };
  15.  
  16.   var sel = {
  17.     name : document.getElementById('name-err'),
  18.     lname: document.getElementById('lname-err'),
  19.     age  : document.getElementById('age-err'),
  20.     mail : document.getElementById('mail-err')
  21.   };
  22.  
  23.   if(el.validity.valueMissing){
  24.     if(el.name == elem.name.name) {
  25.       sel.name.classList.add('flash');
  26.       sel.name.innerHTML = "<p>Please fill the empty field<p>";
  27.     } else if(el.name == elem.lname.name){
  28.       sel.lname.classList.add('flash');
  29.       sel.name.innerHTML = "<p>Please fill the empty field<p>";
  30.     } else if(el.name == elem.age.name){
  31.       sel.age.classList.add('flash');
  32.       sel.name.innerHTML = "<p>Please fill the empty field<p>";
  33.     } else {
  34.       sel.mail.classList.add('flash');
  35.       sel.name.innerHTML = "<p>Please fill the empty field<p>";
  36.     }
  37.   }
  38.   else if(el.validity.typeMissMatch){
  39.     if(el.name == elem.main.name)
  40.       sel.mail.classList.add('flash');
  41.       sel.mail.innerHTML = "<p>Please enter a valid mail<p>";
  42.   }
  43.   else if(el.validity.patternMissMatch){
  44.     if(el.name == elem.name.name) {
  45.       sel.name.classList.add('flash');
  46.       sel.name.innerHTML = "<p>Please, insert just text<p>";
  47.     } else if(el.name == elem.lname.name){
  48.       sel.lname.classList.add('flash');
  49.       sel.name.innerHTML = "<p>Please, insert just text<p>";
  50.     } else if(el.name == elem.age.name){
  51.       sel.age.classList.add('flash');
  52.       sel.name.innerHTML = "<p>Sure is your age?<p>";
  53.     }
  54.   } else {
  55.     console.log('Algo está mal .... ');
  56.     console.log(el);
  57.   }
  58. }
  59.  
  60. function send(){
  61.   var valid = document.welcome.checkValidity();
  62.   if(valid){
  63.     document.welcome.submit();
  64.   } else {
  65.     console.log('nooope');
  66.   };
  67. }
  68.  
  69. window.addEventListener('load', init, false);

Bien, el tema con el document.welcome era que en el evento de carga que inicializaba todo tenía mal referenciada la clase init... todo listo por ese lado.

Hice un par de logs tontos para saber si se saltaba los condicionales y, en efecto, se los salta...

De hecho al interactuar con los campos no pasa gran cosa, de hecho no pasa nada, no muestra los mensajes no cambia en absolutamente nada (cosa que en teoría debería ocurrir a medida que te vas equivocando en los campos).

Si trato de enviar el formulario sin llenar los cambios, efectivamente me dispara el log que le puse. Si relleno los campos mal, me lanza los logs (menos el de email...) y luego, obviamente el 'nooope' tonto de pruebas.

En fin, al menos ya comprobé que las referencias para hacer las comparaciones son correctas, logeando el.name me devuelve el valor de name y así... ¿Qué está mal entonces en el script? Es mi pregunta ahora

Edito:

Ah! Se me olvidaba poner los logs, claro
Código Javascript:
Ver original
  1. "Algo está mal .... "
  2. <input type="text" required="" pattern="[A-Za-z]" placeholder="your name here" name="fname">
  3. "Algo está mal .... "
  4. <input type="text" required="" pattern="[A-Za-z]" placeholder="your lastname here" name="lname">
  5. "Algo está mal .... "
  6. <input type="text" pattern="[0-9]" placeholder="your age here" name="age">
  7. "nooope"