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

Le hice un lifting al código y traté de hacerlo bastaaaaaaaante mas sencillo, pero sigue sin funcionar del todo

Código Javascript:
Ver original
  1. function init () {
  2.   document.welcome.addEventListener('valid', watch, true);
  3.   document.querySelector('.button-send').addEventListener('click', send, false);
  4. }
  5.  
  6. function watch (e) {
  7.   var el = e.target;
  8.   var errMsj = document.getElementById('err-msj');
  9.  
  10.   if (el.validity.valid) {
  11.     console.log('Good');
  12.   } else {
  13.     console.log('Warning');
  14.   }
  15.  
  16. }
  17.  
  18. function send () {
  19.  
  20.   var name     = document.querySelector("input[name='fname']"),
  21.       lname    = document.querySelector("input[name='lname']"),
  22.       age      = document.querySelector("input[name='age']"),
  23.       mail     = document.querySelector("input[name='email']"),
  24.       valid    = document.welcome.checkValidity(),
  25.       errMsj   = document.getElementById('err-msj');
  26.    
  27.   if (valid) {
  28.     document.welcome.submit();
  29.   }
  30.   else {
  31.     if (name.validity.valueMissing || lname.validity.valueMissing || age.validity.valueMissing || mail.validity.valueMissing){
  32.       console.log('missing value');
  33.     } else if (name.validity.patternMissMatch || lname.validity.patternMissMatch || age.validity.patternMissMatch){
  34.       console.log('missing pattern');
  35.     } else {
  36.       if ((mail.validity.typeMissMatch)) {
  37.         console.log('type Missing');
  38.       };
  39.     }
  40.   }
  41. }
  42.  
  43. window.addEventListener('load', init, false);

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.       <div id="err-msj"></div>
  14.       <form name="welcome" method="post">
  15.         <div class="fields">
  16.           <div class="field">
  17.             <label for="fname">Name:</label>
  18.             <input type="text" name="fname" placeholder="your name here" pattern="[A-Za-z]" required>
  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>
  24.           <div class="field">
  25.             <label for="age">Age:</label>
  26.             <input type="text" name="age" placeholder="your age here" pattern="[0-9]">
  27.           </div>
  28.           <div class="field">
  29.             <label for="mail">Email:</label>
  30.             <input type="text" name="email" placeholder="[email protected]" required>
  31.           </div>
  32.           <div class="radios"><span>Sex:</span>
  33.             <input type="radio" name="male" value="male"><span>Male</span>
  34.             <input type="radio" name="female" value="female"><span>Female</span>
  35.           </div>
  36.           <div class="text">
  37.             <textarea name="message"></textarea>
  38.           </div>
  39.           <div class="button-wrapper">
  40.             <input type="button" name="send" value="Send" class="button-send">
  41.           </div>
  42.         </div>
  43.       </form>
  44.     </section>
  45.   </body>
  46. </html>

Acá el cambio es que en vez de volverme loco tratando de disparar un aviso distinto por cada error en forma de caja, lo hago (de forma simulada con logs, por los momentos) con una sola caja que avisa que hay errores en las casillas marcadas (en este caso, lo hago con la pseudo clase :invalid de css) ... o bueno, se supone que debería ir lanzando un log a medida que se equivoca un campo, cosa que no pasa en la función watch.

Respecto a la función send() pues hay un comportamiento extraño. Se supone que cuando se hace click en el botón para enviar el formulario, se activa el condicional que evalúa: si el formulario es válido, envíalo, sino lanza alguna de estas excepciones (los if anidados).

Nada de esto pasa, el único evento que se dispara es si hay un campo vacío, mas allá de eso no se evalúa nada a menos que cambie el tipo de botón button por submit y ahí más o menos empieza a validar, pero sigue sin disparar otros eventos, me dice siempre el mismo log de "value is missing" aunque haya un patternMissMatch. Además, siempre me muestra las cajas de comentarios feas y no hay manera de sacarlas.

Al parecer validar del lado del cliente con la API HTML5 no es tan simple