Comunidad de diseño web y desarrollo en internet online

Duda con JavaScript - Interceptar "submit" en formulario

Citar            
MensajeEscrito el 14 Dic 2007 01:32 pm
Hola buenas y gracias a tod@s por vuestro tiempo.

Hace poco que tonteo con js y tengo algunos conceptos que no me quedan claros.
Estoy haciendo un script para validar formularios en js y me surgen algunas dudas.
El funcionamiento es muy básico, tenemos una pagina html con un formulario a la que hemos añadido un script js. Este script se encarga de que cuando el usuario hace click en el botón "enviar" se validen los campos de entrada.
Esto No es parte del problema. El problema es la forma en JavaScript funciona.
Al final, la función que valida los campos nos devolverá "true" si los campos son correctos o "false" si no lo son. Evidentemente, si el formulario no pasa la validación necesaria queremos que no se cambie a la pagina marcada por el atributo "action" del formulario, si no que se quede en la misma y así el usuario pueda remediar su entrada de datos.
Pues aquí es donde tengo el problema.
Os pongo mis dos archivos para que sea mas facil la visualización del problema.

test.html

Código :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title></title>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8"/>
<meta http-equiv="content-style-type" content="text/css"/>

<script type="text/javascript" src="script1.js"></script>
</head>
<body>

<form id="formulario" action="test_test.html" method="get" enctype="multipart/form-data">
   
   <p><input type="text" /></p>
   <p><input type="submit" /></p>

</form>

</body>
</html>


y aqui el archivo js

script1.js

Código :

function addListener (element, baseName, handler) {
   if (element.addEventListener)
      element.addEventListener(baseName, handler, false);
   else if (element.attachEvent)
      element.attachEvent('on'+baseName, handler);
} //addListener

function initForm () {
   form  = document.getElementById('formulario');
   form.onsubmit = checkForm;
   //addListener (form, 'submit', checkForm);   
   
} //initForm


function  checkForm () {

   if (true){
      alert ('No Validation');
      return false;
      } else {
         alert ('Validation Passed');
         return true;
         }
               
} //checkForm
 
addListener (window, 'load', initForm)


Como veis en la función initForm hay una linea que esta comentada y es esta mi duda.
Tal y como esta ahora el script todo funciona bien. Pero si comento la linea form.onsubmit = checkForm
y descomento la linea de addListener... se hace la validación pero TAMBIÉN se hace el cambio de página ¡Con lo que la Validación no sirve de nada!

¿Alguien me podría explicar la diferencia entre estas dos lineas?

Por ChickenExecutor

351 de clabLevel

2 tutoriales
1 articulo

 

El pais de la Resistance

mozilla
Citar            
MensajeEscrito el 17 Dic 2007 12:43 am
Te sugeriria que lo hicieras de otra forma:

  1. Creas una funcion que valide el formulario
  2. Esa es la funcion que invocara tu boton "enviar"
  3. La funcion valida el formulario. Si este cumple los requisitos, se ejecuta el submit, a la pagina que manejara los datos


La idea es algo como lo siguiente:

Código :

<script>
/*
Creamos la funcion de validar el form.
Es POO style, asi que para invocarla, usamos "new"
*/
function ValidarFormulario(){
   //Asignamos el elemento dom del formulario a "mi_form"
   var mi_form = document.miformulario;
   //Este es el contador de comprobaciones
   comprobaciones = 0;
   //Este es el status que chequearemos al pasar la funcion
   this.status = false;
   //Este será el error por defecto que lanzaremos (si hay un error)
   this.error = "Error en la validacion. \n";
   
   //Chequeamos que el nombre haya sido ingresado
   if( mi_form.nombre.value.length > 0 ){
      comprobaciones++
   }else{
      this.error += "Debe ingresar un nombre. \n";
   }
   
   // Chequeamos que la edad haya sido ingresada y sea numerica
   var edad = mi_form.edad.value;
   if( (edad.length > 0) && ( ! (isNaN(edad)))){
      comprobaciones++
   }else{
      this.error += "Debe ingresar una edad, y esta debe ser numerica. \n";
   }
   
   //Chequeamos que todos los campos hayan pasado la validacion
   if( comprobaciones >= 2 ){
      this.status = true;
   }else{
      this.status = false;
   }
   
   //Devolvemos el objeto, para poder "jugar" con el al "otro lado".
   return this;
}
//Cuando la ventana este cargada... (por lo tanto el DOM tambien... )
window.onload = function(){
   // Asignamos el evento de forma no intrusiva
   var boton = document.getElementById("enviar");
   boton.onclick = function(){
      //Creamos una instancia de nuestra funcion de validar
      var formulario = new ValidarFormulario();
      var form_html = document.miformulario;
      if( formulario.status == true ){
         alert("Se ha validado completamente");
         //Cambiamos el action a la pagina donde validaremos los datos (ver explicacion luego)
         form_html.action = "prueba.html";
         //Enviamos el form
         form_html.submit();
      }else{
         //O alertamos todos los errores
         alert(formulario.error);
      }
   }
}
</script>
<body>
<!-- Este es nuestro form. La accion por defecto es una pagina que valide los datos en php, si no hay javascript, por accesibilidad. Si hay js, este cambiara el action -->
   <form name="miformulario" action="validar_datos.php">
      <input type="text" name="nombre" />
      <input type="text" name="edad" />
      <!-- Usamos un <a> cualquiera, que podriamos formatear como boton por css -->
      <a id="enviar" href="#">Enviar</a>
      <!--Colocamos una alternativa accesible por si no hay Javascript-->
      <noscript>
         <input type="submit" value="Validar datos">
      </noscript>
   </form>
</body>


Mucha suerte ;)

Por Lunatic Lycanthrop

Claber

1203 de clabLevel

7 tutoriales

1 ejemplo

Genero:Masculino  

The dark places where wolves access internet with 46,6 kbps

firefox
Citar            
MensajeEscrito el 17 Dic 2007 01:43 am
Lo siento pero tu proposición no me convence. En primer lugar no creo que la opción de enviar los datos de un formulario mediante un link sea muy standard, además los enlaces tienen que tener un link valido, no sirve # (según las recomendaciones del w3c).
Además no es eso lo que estaba preguntando, sino la diferencia entre asignar al formulario un evento, en este caso submit, o interceptar un evento de nivel 0.
Gracias de todas formas. ;-)

Por ChickenExecutor

351 de clabLevel

2 tutoriales
1 articulo

 

El pais de la Resistance

mozilla
Citar            
MensajeEscrito el 17 Dic 2007 03:26 pm
Primero usa un input de tipo button y al evento onclick le asignas una funcion de javascript y de alli envias el formulario haciendo previamente lo que quieras.

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 17 Dic 2007 04:43 pm

En primer lugar no creo que la opción de enviar los datos de un formulario mediante un link sea muy standard, además los enlaces tienen que tener un link valido, no sirve # (según las recomendaciones del w3c).


Entonces cambia el link por un boton. Si le asignas el id al boton, el script seguira funcionando. Me parece que de cualquier manera no entendiste la idea del script que te pasé, pues este hace lo que sugiere Maikel:
Al hacer click a enviar se validan los campos con una funcion de Javascript, acto seguido estos datos se envian.

Si tienes "remordimientos de accesibilidad", en el mismo ejemplo va la solucion:
* En un ambiente con javascript, el usuario ingresa los datos. Luego, la funcion valida si son correctos. Acto seguido, el destino del formulario se cambia a una pagina que, por ejemplo, ingrese esos datos a una base de datos, y luego se envian esos datos.

* En un ambiente sin javascript, el usuario ingresa sus datos, oprime el <input type="submit">, y el formulario direcciona a una pagina donde los datos son validados del lado del servidor, y de ahi, si se requiere, son ingresados a nuestro ejemplo de base de datos.

Creeme, te propuse una buena idea :P


Además no es eso lo que estaba preguntando, sino la diferencia entre asignar al formulario un evento, en este caso submit, o interceptar un evento de nivel 0.


Mil perdones, esta parte de tu pregunta no la habia visto. Lo que pasa con el comentario en la linea es lo siguiente:
Cuando ejecutas el formulario.onsubmit = funcionQueValida() le estas diciendo al navegador: "Cuando el formulario se envie, valida los campos". El evento submit envia que el proceso de mandar los campos ya se esta haciendo (o ya se hizo). De tal manera, no puedes contrarrestar el proceso de cambiar de pagina, inhabilitando la validacion.

Lo que tienes que hacer es lo que ya te sugerimos: En ves de usar un boton de submit, asignas un "trigger" (un boton, link, o lo que quieras) para que incie la validacion. De ahi, si la validacion funciona, bueno, mandas el formulario.

Espero que eso despeje tus dudas ;)

Por Lunatic Lycanthrop

Claber

1203 de clabLevel

7 tutoriales

1 ejemplo

Genero:Masculino  

The dark places where wolves access internet with 46,6 kbps

firefox
Citar            
MensajeEscrito el 18 Dic 2007 05:45 pm

Lunatic Lycanthrop escribió:


Cuando ejecutas el formulario.onsubmit = funcionQueValida() le estas diciendo al navegador: "Cuando el formulario se envie, valida los campos". El evento submit envia que el proceso de mandar los campos ya se esta haciendo (o ya se hizo). De tal manera, no puedes contrarrestar el proceso de cambiar de pagina, inhabilitando la validacion.


Al fin alguien que lee los posts (perdon eso a sido mi Hyde tomando la palabra :P )
Gracias, ahora sí lo he entendido.
Lo que yo hago para procesar formularios es, simplemente interceptar el "submit" del formulario y procesarlo con JS. De todas formas no cambio el "action". Si el usuario tiene javascript activado se hace la validación en el ordenador de este, y se envían los datos a la misma pagina que debe hacer la validación si el usuario no tiene JS activado. ¿Porqué? pues no se, pero seguro que asi nunca llegaran datos no validados a mi aplicación, de todas formas si se ha validado con JS no habrá retorno de pagina, así que no se perderá tiempo, solo en ejecución de servidor.

Gracias por vuestras respuestas majetes.

Por ChickenExecutor

351 de clabLevel

2 tutoriales
1 articulo

 

El pais de la Resistance

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.