Foros del Web » Programando para Internet » Javascript »

Incluir varias funciones en una principal

Estas en el tema de Incluir varias funciones en una principal en el foro de Javascript en Foros del Web. Hola a tod@s, Tras buscar por todo el foro, google y tal encontré varios ejemplos pero al final ninguno me ha funcionado o no he ...
  #1 (permalink)  
Antiguo 25/11/2011, 06:21
 
Fecha de Ingreso: mayo-2004
Ubicación: Madrid
Mensajes: 15
Antigüedad: 19 años, 11 meses
Puntos: 0
Pregunta Incluir varias funciones en una principal

Hola a tod@s,
Tras buscar por todo el foro, google y tal encontré varios ejemplos pero al final ninguno me ha funcionado o no he sabido utilizarlos.
Antes de nada, comentaros que estoy empezando en el mundo del JavaScript, así que perdonad si estoy un poco perdido o cometo fallos grotescos, y tras haber dicho esto os comento mi problema:
Me he creado una especie de plantilla para hacer la validacion de cualquier campo que podria encontrarme en un formulario, pero sobre todo con los que trabajaría, es decir, campos de texto, numéricos, de edad, telefonicos, email, dni botones de radio, select, etc. y hasta aquí bien, teniendo por ejemplo por separado las funciones de validar_texto(), validar_dni(), validar_email(), etc... sin embargo quiero meter todas estas funciones en una que se llame validar_todo() y luego llamar a esta última función desde el onsubmit de un formulario.
he probado llamar a esas funciones de la forma:
Código:
function validar_todo(){
      validar_texto();
      validar_edad();
      validar_telefono();
      validar_email();

}
Pero me sale el mensaje de alert con los errores y se me acaba enviando el formulario con los campos vacios.
Cuando pruebo las funciones de texto, dni, etc por separado si me funcionam.
Y he aquí mi pregunta, ¿Como puedo hacer para que desde la funcion validar_todo me llame a las otras funciones y que en caso de que todas sean válidas me envie el formulario?
Muchisimas gracias, pero es que me estoy volviendo loco.
Por si os sirve de ayuda os indico lo que tengo:
Código:
<script type="text/javascript">
function validar_todo(){
 validar_texto();
 validar_edad();
 validar_telefono();
 validar_numero();
validar_dni();
validar_sexo();
validar_select();
validar_cp();
validar_email();
validar_check();
}

//hago validacion nombre
function validar_texto(){
if(document.envio.nombre.value.length==0){
alert("Introduzca su nombre");
return false;
}
}

//hago validacion edad
function validar_edad(){
edad2= document.getElementById('edad').value;
if (edad2==""){
       alert("Por favor introduzca su edad.")
             return false;
    }else{
       if (edad2<18){
          alert("Debe ser mayor de 18 años.")
         return false;
       }
    } 
}

//hago validacion telefono
function validar_telefono(){
telefono2= document.getElementById('telefono').value;
if (telefono2==""){
       alert("Por favor introduzca un telefono.")
             return false;
    }else{
if( !(/^\d{9}$/.test(telefono2)) ) {
alert("Introduzca un formato correcto de telefono");
return false;
}
}
}

//hago validacion campo numerico
function validar_numero(){
numero2= document.getElementById('numero').value;
if (numero2==""){
       alert("Por favor introduzca un numero.")
             return false;
    }else{
if( isNaN(numero2) ) {
	alert("Por favor introduzca un numero correcto.")
  return false;
}
}
}

//hago validacion dni
function validar_dni(){
dni2= document.getElementById('dni').value;
var letras = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E', 'T'];
 
if( !(/^\d{8}[A-Z]$/.test(dni2)) ) {
	alert("Por favor introduzca un dni correcto.")
  return false;
}
 
if(dni2.charAt(8) != letras[(dni2.substring(0, 8))%23]) {
	alert("Por favor introduzca una letra correcta.")
  return false;
}
}

//hago validacion Radiobutton
function validar_sexo(){
sexo2= document.getElementsByName('sexo');
var seleccionado = false;
for(var i=0; i<sexo2.length; i++) {	
  if(sexo2[i].checked) {
    seleccionado = true;
    break;
  }
}
 
if(!seleccionado) {
	alert("Por favor indiquenos su sexo.")
  return false;
}
}

//hago validacion select
function validar_select(){
opciones2= document.getElementById('opciones').selectedIndex;
if(opciones2 == null || opciones2== 0 ) {
	alert("Por favor seleccione una opcion")
  return false;
}
}

//hago validacion codigo postal(es igual que el del numero pero con el limite de 5 cifras en las caracteristicas del form
function validar_cp(){
cp2= document.getElementById('cp').value;
if (cp2==""){
       alert("Por favor introduzca su codigo postal.")
             return false;
     }else{
if( !(/^\d{5}$/.test(cp2)) ) {
alert("Introduzca un codigo postal correcto");
return false;
}
}
}

//hago validacion email
function validar_email(){
if (document.envio.email.value==""){
       alert("Por favor introduzca una direccion de email.")
             return false;
    }else{
if (document.envio.email.value.indexOf('@',0)==-1 ||
       document.envio.email.value.indexOf('@',0)== 0 ||
       document.envio.email.value.indexOf('.',0)==-1) {
alert("Dirección de e-mail inválida");
return false;
}
}
}

//hago validacion checkbox
function validar_check(){
elemento= document.getElementById('privacidad');
if (!elemento.checked){
alert("Por favor, acepte las condiciones de proteccion de datos.Gracias");
return false;
}

}


</script>
Ah, y si quereis usar el código para tenerlo como ejemplo podeis usarlo.
Gracias de nuevo
  #2 (permalink)  
Antiguo 25/11/2011, 06:33
Avatar de ryugen
Colaborador
 
Fecha de Ingreso: agosto-2008
Ubicación: Rosario, Santa Fe
Mensajes: 350
Antigüedad: 15 años, 7 meses
Puntos: 187
Respuesta: Incluir varias funciones en una principal

para que no haga submit la funcion validar_todo deberia devolver un valor falso, viendo que las demas funcionan ya lo hacen podrias hacer algo asi:

Código Javascript:
Ver original
  1. function validar_todo(){
  2. if( !(validar_texto() && validar_edad() && validar_telefono() && validar_email() ) )
  3.         return false;
  4. }

Osea si se cumplen todas las condiciones no devuelvo falso y hago submit, sino para el envio
  #3 (permalink)  
Antiguo 25/11/2011, 07:43
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Incluir varias funciones en una principal

En caso de que tengas muchas validaciones trabajar dentro de un condicional te va a volver loco.

Lo ideal seria que cada validación solo valide lo que tiene que validar, devolviendo un error (o lanzandolo) sin mostrar ningún mensaje al usuario, ya que esa responsabilidad no le corresponde.

Un ejemplo rápido:

Código Javascript:
Ver original
  1. // Ejecuta todas las validaciones
  2. function validar_todo() {
  3.     var validaciones, errores, actual;
  4.  
  5.     validaciones = [
  6.         validar_a,
  7.         validar_b,
  8.         validar_c,  
  9.     ];
  10.  
  11.     errores = [];
  12.  
  13.     for(var i = 0; i < validaciones.length; i++) {
  14.         // Ejecuta la validacion actual
  15.         actual = validaciones[i]();
  16.  
  17.         // Si la validacion devolvio algo distinto de true,
  18.         // es que fallo
  19.         if(actual !== true) {
  20.             errores.push(actual);
  21.         }
  22.     }
  23.  
  24.     if(errores.length) {
  25.         alert(errores.join("\n"));
  26.     } else {
  27.         alert('Todo ok');
  28.     }
  29. }
  30.  
  31. // Validaciones simuladas
  32.  
  33. function validar_a() {
  34.     if(Math.random() > 0.5) {
  35.         return 'A no es valido';
  36.     }
  37.     return true;
  38. }
  39.  
  40. function validar_b() {
  41.     if(Math.random() > 0.5) {
  42.         return 'B no es valido';
  43.     }
  44.     return true;
  45. }
  46.  
  47. function validar_c() {
  48.     if(Math.random() > 0.5) {
  49.         return 'C no es valido';
  50.     }
  51.     return true;
  52. }
  53.  
  54. // Ejecutamos la validacion
  55. validar_todo();
__________________
blog | @aijoona
  #4 (permalink)  
Antiguo 25/11/2011, 08:45
 
Fecha de Ingreso: mayo-2004
Ubicación: Madrid
Mensajes: 15
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: Incluir varias funciones en una principal

Gracias ryugen,
Si le doy a enviar con todos los campos vacios me devuelve el error del primer campo vacio y no se me envia el formulario (como tiene que ser), pero despues de eso ya no me "funciona" el enviar, es decir, que es como si se quedara con el estado false y no se envia aunque todos los campos estén rellenados correctamente.
  #5 (permalink)  
Antiguo 25/11/2011, 09:07
 
Fecha de Ingreso: mayo-2004
Ubicación: Madrid
Mensajes: 15
Antigüedad: 19 años, 11 meses
Puntos: 0
Pregunta Respuesta: Incluir varias funciones en una principal

Gracias Aijoona,
He hecho (o creo haber hecho lo que me has indicado) y me pasa lo de antes, me salen todos los errores de golpe y se me envia el formulario, pero el campo texto que es en el que he puesto lo que me decias no me devuelve error ni nada.
Por ejemplo en la funcion validar_todo he puesto:
Código Javascript:
Ver original
  1. function validar_todo() {
  2.     var validaciones, errores, actual;
  3.  
  4.     validaciones = [validar_texto,validar_edad,validar_telefono,validar_email,validar_numero,validar_dni,validar_sexo,validar_select,validar_cp,validar_email,validar_check,];
  5.  
  6.     errores = [];
  7.  
  8.     for(var i = 0; i < validaciones.length; i++) {
  9.         // Ejecuta la validacion actual
  10.         actual = validaciones[i]();
  11.  
  12.         // Si la validacion devolvio algo distinto de true,
  13.         // es que fallo
  14.         if(actual !== true) {
  15.             errores.push(actual);
  16.         }
  17.     }
  18.  
  19.     if(errores.length) {
  20.         alert(errores.join("\n"));
  21.     } else {
  22.         alert('Todo ok');
  23.     }
  24. }

Y en la funcion del texto he puesto:
Código Javascript:
Ver original
  1. function validar_texto(){
  2. if(document.envio.nombre.value.length==0){
  3. return 'texto no es valido';
  4. }
  5. else {return true;}
  6. }

Sabes en que podria haberme equivocado?
  #6 (permalink)  
Antiguo 25/11/2011, 09:16
Avatar de ryugen
Colaborador
 
Fecha de Ingreso: agosto-2008
Ubicación: Rosario, Santa Fe
Mensajes: 350
Antigüedad: 15 años, 7 meses
Puntos: 187
Respuesta: Incluir varias funciones en una principal

desde que evento estas llamando la funcion?
  #7 (permalink)  
Antiguo 25/11/2011, 09:25
 
Fecha de Ingreso: mayo-2004
Ubicación: Madrid
Mensajes: 15
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: Incluir varias funciones en una principal

Cita:
Iniciado por ryugen Ver Mensaje
desde que evento estas llamando la funcion?
desde un onsubmit:
Código Javascript:
Ver original
  1. <form action="<?=$_SERVER['PHP_SELF']?>" method="post" name="envio" id="envio" onSubmit="return validar_todo();">

Etiquetas: formulario, funcion, funciones, incluir, principal
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:25.