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

Digamos que estamos validando un formulario con Javascript y la API HTML5 para formularios, validityState, checkValidity etc... yo lo estoy intentando pero quiero llevarlo un pasito mas allá que simplemente validar en tiempo real cambiándole los colores a un input no válido, quiero agregar en ese mismo tiempo real alertas con cajas de mensajes (puede que no lo haga sino que sea mas diferido, cuando haga click en enviar, lo del tiempo real no es importante).

La cosa es que lo estoy haciendo en puro vanilla JS, primero. Luego usaré Jquery y otras librerías puesto que con esto quiero sacar unos benchs a ver cual es mas eficiente (vanilla, obviamente) y cuantas ops/sec hace cada script.

En fin mi duda está en como hacer para ir apareciendo los mensajes correspondientes en el input errado. Lo primero y principal es, claro está, el trigger del evento:

Código Javascript:
Ver original
  1. document.welcome.addEventListener('invalid', validate, true);

La forma lógica de trabajarlo sería así:

Código Javascript:
Ver original
  1. function validate(e) {
  2.     var elem = e.target;
  3.  
  4.     if(elem.validity.valid){
  5.       .... foo bar
  6.     }
  7. }

He estado investigando y si bien sé que target es un atributo del evento que seleccionará el elemento (input en este caso) que esté fallando, no se como compararlo ya que no se si devuelve una referencia.

Me explico un poco más:

Lo que realmente quiero es poder comprobar cual es el elemento que está fallando para activar el div correspondiente debajo del input. Hay varias maneras de tener dispuestas las cajas, puedo o tener un div listo con la clase y mantenerle el display: none y cambiarle luego los atributos, cambiarle la clase o hasta crear un nuevo elemento y ponerlo al final, la cosa es saber cual input falla para poner debajo de la caja con el mensaje.

So, si tengo este html:

Código HTML:
Ver original
  1. <div class="fields">
  2.         <div class="field">
  3.           <label for="fname">Name:</label>
  4.           <input type="text" name="fname" placeholder="your name here" required>
  5.           <div id="name" class="flash"></div>
  6.         </div>

necesito entonces saber si mi input[name="fname"] es el target que falla para poner a funcionar el div#name.flash por poner un ejemplo.

¿Como hago la comparación? ¿Puedo extraer del elemento target algo así como su campo name? ¿Puedo hacer una simple comparación entre element == document.querySelector("input[name='fname'] ... ")? Ahí es donde radica mi duda

edito:

Pues hasta ahora investigando se supone que puedo acceder a los elementos del DOMTree en un evento como cualquier otro elemento (en teoría), codee este script básico a ver que tal va, este es:

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('alo?');
  56.   }
  57. }
  58.  
  59. function send(){
  60.   var valid = document.welcome.checkValidity();
  61.   if(valid)
  62.     document.welcome.submit();
  63. }
  64.  
  65. window.addEventListener('load', init(), false);

Solo hay una cuestión, me dice "TypeError: document.welcome is undefined"... lo raro (y divertido) es que si accesa a document.welcome desde la consola JS de firefox/chrome sin líos, mas no desde el script ._____.

Aún no he podido probarlo, no encuentro la razón de ese error.

A cualquier idea, opinión y respuesta ... muchas gracias!

Última edición por nanotime; 15/06/2014 a las 15:17