Validación de un formulario con Javascript

Valoración del artículo:
Cómo validar un formulario en una página web, en el lado del cliente con Javascript. Se comprueban todos sus campos y si son correctos, se envía el formulario.
Publicado: 05/1/05
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
Vamos realizar un ejemplo de un formulario completo para validar. Las validaciones se hacen en el propio navegador antes de enviarlo. Si hubo algún campo no relleno o con información errónea, el formulario muestra el campo que está incorrecto y solicita al usuario que lo cambie. Si todos los datos del formulario son correctos se envía el formulario.

Hemos querido hacer un formulario sencillo, para que el ejercicio no se haga demasiado complicado. No obstante, se realizan validaciones en campos con distintos valores, para hacerlo más variado. Se comprueba un campo donde debe figurar un texto, otro donde debe introducirse un número mayor que 18 y un último con un campo select donde deben haber seleccionado un valor.

Referencia: para comprender este ejercicio hace falta conocer el trabajo con formularios con Javascript. Podemos aprender también Javascript desde cero http://www.desarrolloweb.com/javascript/, si es que fuera necesario.

Se puede ver el ejemplo en funcionamiento para hacerse una idea más exacta del objetivo buscado.

El código del formulario

El formulario con el que vamos a trabajar es el siguiente:

<form name="fvalida">
<table>
<tr>
    <td>Nombre: </td>
    <td><input type="text" name="nombre" size="30" maxlength="100"></td>
</tr>
<tr>
    <td>Edad: </td>
    <td><input type="text" name="edad" size="3" maxlength="2"></td>
</tr>
<tr>
    <td>Interés:</td>
    <td>
    <select name=interes>
    <option value="Elegir">Elegir
    <option value="Comercial">Contacto comercial
    <option value="Clientes">Atención al cliente
    <option value="Proveedores">Contacto de proveedores
    </select>
    </td>
</tr>
<tr>
    <td colspan="2" align="center"><input type="button" value="Enviar" onclick="valida_envia()"></td>
</tr>
</table>
</form>


Es un formulario cualquiera. Los únicos puntos donde debemos prestar atención son:
  • El nombre del formulario, "fvalida", que utilizaremos para referirnos al él mediante Javascript.
  • El botón de enviar, que en lugar de ser un submit corriente, es un botón que llama a una función, que se encarga de validar el formulario y enviarlo si todo fue correcto.
Función Javascript para validar el formulario

Ahora veremos la función que hemos creado para validar el formulario. Se llama valida_envia(). Simplemente, para cada campo del formulario, comprueba que el valor introducido es correcto. Si no es correcto, muestra un mensaje de alerta, pone el foco de la aplicación en el campo que ha dado el error y abandona la función retornando el valor 0.

Si todos los campos eran correctos, la función continúa hasta el final, sin salirse, por no estar ningún campo incorrecto. Entonces ejecuta la sentencia última, que es el envío del formulario.

Veamos la función entera, aunque luego la expliquemos por partes.

function valida_envia(){
    //valido el nombre
    if (document.fvalida.nombre.value.length==0){
       alert("Tiene que escribir su nombre")
       document.fvalida.nombre.focus()
       return 0;
    }

    //valido la edad. tiene que ser entero mayor que 18
    edad = document.fvalida.edad.value
    edad = validarEntero(edad)
    document.fvalida.edad.value=edad
    if (edad==""){
       alert("Tiene que introducir un número entero en su edad.")
       document.fvalida.edad.focus()
       return 0;
    }else{
       if (edad<18){
          alert("Debe ser mayor de 18 años.")
          document.fvalida.edad.focus()
          return 0;
       }
    }

    //valido el interés
    if (document.fvalida.interes.selectedIndex==0){
       alert("Debe seleccionar un motivo de su contacto.")
       document.fvalida.interes.focus()
       return 0;
    }

    //el formulario se envia
    alert("Muchas gracias por enviar el formulario");
    document.fvalida.submit();
}


En el primer bloque se valida el campo nombre. La validación que se hace es simplemente si se ha escrito algo en el campo. Para ello comprueba si el número de caracteres escritos en el campo nombre es cero. En ese caso, muestra el mensaje de alerta, sitúa el foco en el campo de texto y se sale de la función devolviendo el valor 0.

Nota: el foco de la aplicación es el lugar donde está situado el cursor. El foco puede estar en cualquier sitio. Por ejemplo en un campo de texto, en un select, en un enlace o en la propia página. Si presionamos una tecla del teclado afecta al lugar donde está situado el foco. Si, por ejemplo, el foco está en un campo de texto, al operar con el teclado estaremos escribiendo en ese campo de texto.

La validación de la edad mayor que 18 años tiene dos partes. Primero debemos comprobar que en el campo de texto hay escrito un valor entero. Luego, si teníamos un entero, habría que comprobar que es mayor que 18. Para hacer esta validación nos vamos a apoyar en una función que ya hemos visto en otro artículo de DesarrolloWeb.com, que habla sobre cómo validar un entero en un campo de formulario. Esa función devuelve un string vació en caso de que no sea un entero y el propio entero, si es que lo era.

Antes de realizar la validación de la edad propiamente dicha, se obtiene el valor introducido en el campo de formulario edad y se guarda en una variable llamada edad. Luego se ejecuta la función pasando esta edad. Su resultado lo utilizamos para volcarlo otra vez al campo de texto. Entonces, se comprueba si el valor devuelto por la función es un string vacío. En ese caso, es que el valor escrito en el formulario no era un entero, por lo que se muestra el mensaje de error, se sitúa el foco y se sale de la función.

En caso de que el campo edad contuviese un entero, se debe comprobar a continuación si es mayor que 18. En caso de que sea menor, se muestra el error y se sale. En caso contrario -entonces el valor sería mayor o igual que 18-, se continúa con las comprobaciones.

Por último se valida el campo select, donde aparece el interés del supuesto visitante, que le motiva para enviarnos el formulario. En ese campo se debe haber seleccionado cualquier opción menos la primera. Para asegurarnos, simplemente se comprueba si el atributo selectedIndex del campo select tiene el valor 0. Ese atributo almacena el índice seleccionado en el menú desplegable. El primer campo tiene el índice 0, el segundo el índice 1...

Si se comprueba que selectedIndex vale 0, se muestra un mensaje de alerta, se pone el foco en el campo del formulario y se sale de la función.

Si hemos llegado hasta este punto sin salirnos de la función es que todos los campos del formulario estaban rellenos correctamente. En ese caso se debe enviar el formulario. Antes de enviar el formulario se muestra un mensaje de alerta, agradeciendo que se haya rellenado correctamente. Este mensaje se puede suprimir si se desea.

Para enviar el formulario se hace una llamada al método submit() de dicho formulario.

Conclusión

Este ejercicio es de lo más básico y útil que se puede hacer en Javascript. Requiere ciertos conocimientos, ya ligeramente avanzados, pero en el fondo no resulta complicado. Incluso ampliarlo es bastante sencillo, siempre que sigamos un esquema similar para cada uno de los campos.

Podemos ver el resultado obtenido en una página aparte.

Comentarios
Fueron enviados 28 comentarios al artículo
20 comentarios no revisados
8 comentarios revisados:
Por: Carlos
08/1/05
Muy bueno tu articulo Miguel.
yo necesitaba algo muy parecido y me di cuenta de un pequeño detalle que pasa si lleno la caja de texto NOMBRE con puros espacios en blancos.
Veo que no has validado eso. Yo tambien tenia ese pequeño problemilla y lo soluciones agrgando un par de funciones que de hecho las encontre en internet.
function Trim( str ) {
var resultStr = "";
resultStr = TrimLeft(str);
resultStr = TrimRight(resultStr);
return resultStr;
}

function TrimLeft( str ) {
var resultStr = "";
var i = len = 0;
if (str+"" == "undefined" || str == null)
return "";
str += "";

if (str.length == 0)
resultStr = "";
else {
len = str.length;
while ((i <= len) && (str.charAt(i) == " "))
i++;
resultStr = str.substring(i, len);
}
return resultStr;
}

function TrimRight( str ) {
var resultStr = "";
var i = 0;
if (str+"" == "undefined" || str == null)
return "";
str += "";
if (str.length == 0)
resultStr = "";
else {
i = str.length - 1;
while ((i >= 0) && (str.charAt(i) == " "))
i--;
resultStr = str.substring(0, i + 1);
}

return resultStr;
}

----------------
Como ven la funcion TRim quita los espacios en blancos que existan a los costados de una cadena y para ello se vale de dos funciones TrimRight y TrimLeft que quitan espacios a la derecha e izquierda de la cadena respectivamente.

Luego puedes agragarle a tu funcion de validacion algo como lo siguiente:

function valida_envia(){
...
...
...
nom = document.Formulario.nombre.value;
if ( Trim(nom)=="" ){
alert ("Por favor ingrese su nombre correctamente");
return;
}

.....
.....
}

-----
Espero que les sea de ayuda.
Y espero sigas enviando articulos. Esto de compartir conocimientos es muy bueno.
Bueno adios y gracias fue de mucha tu articulo.
Por: Andres
14/3/05
Probé hacer un script muy similar al que muestran aquí, pero el problema es que luego de mostrar el error, el formulario se seguía enviando con los errores.

Para solucionarlo cambie los "return 0" por "return false" y luego llame a la función de la siguiente manera:

<form name="form1" action="contacto.php" method="post" onSubmit="javascript:return validar();">

Saludos
Por: Gonzalo
31/1/06
VALIDACION DE FECHA Y FORMATO

<SCRIPT LANGUAGE="JavaScript">
function Validar(Form)
{ var bisiesto_ini=0;var bisiesto_fin=0;var fecha=new Date();var anyo=0;
var diainicio=0;var mesinicio=0;var anyoinicio=0;var error=0;var campos=0
var diafin=0;var mesfin=0;var anyofin=0;var mayor=0;var mensaje='';
var barra1ini='';barra2ini='';var barra1fin='';barra2fin='';

barra1fin=Form.fechafin.value.substr(2,1);
barra2fin=Form.fechafin.value.substr(5,1);
barra1ini=Form.fechainicio.value.substr(2,1);
barra2ini=Form.fechainicio.value.substr(5,1);
diainicio=Form.fechainicio.value.substr(0,2);
mesinicio=Form.fechainicio.value.substr(3,2);
anyoinicio=Form.fechainicio.value.substr(6,4);
diafin=Form.fechafin.value.substr(0,2);
mesfin=Form.fechafin.value.substr(3,2);
anyofin=Form.fechafin.value.substr(6,4);

bisiesto_fin=anyofin%4;bisiesto_ini=anyoinicio%4;
anyo=fecha.getYear(); mes=fecha.getMonth()+1; dia=fecha.getDate();

/*control formato*/

if (Form.fechainicio.length<10 || barra1ini!='/' || barra1ini!='-')
{alert("RELLENE LA FECHA INICIO CON EL FORMATO ESPECIFICADO");
Form.fechainicio.focus();Form.fechainicio.value='';return false;}

if (Form.fechainicio.length<10 || barra1ini!='/' || barra1ini!='-')
{alert("RELLENE LA FECHA FIN CON EL FORMATO ESPECIFICADO");
Form.fechafin.focus();Form.fechafin.value='';return false;}
/*fin control formato*/

/*control si la fecha inicial es mayor a la inicial*/
if (anyofin<anyoinicio){mayor=1;}
if (mesfin<mesinicio && anyofin==anyoinicio){mayor=1;}
if (diafin<diainicio && mesfin==mesinicio && anyofin==anyoinicio){mayor=1;}
if (mayor==1)
{error=1;mensaje='LA FECHA INICIAL NO PUEDE SER MENOR QUE LA FINAL';}
/*Fin control si la fecha inicial es mayor a la inicial*/

/*control de meses que tienen 31 dias*/
if (diainicio==31 && (mesinicio==2 || mesinicio==4 || mesinicio==6 || mesinicio==9 || mesinicio==11) )
{error=1;campos=1;
mensaje='MES CON MENOS DE 31 DIAS EN FECHA INICIAL';}
/*fin control de meses que tienen 31 dias*/

/*año bisiesto*/
if((diainicio>28 && mesinicio==2 && bisiesto_ini!=0) || (diafin>28 && mesfin==2 && bisiesto_fin!=0))
{mensaje='FECHA NO BISIESTA';
if (mesinicio==2){campos=1;}
if (mesfin==2){campos=2;}
error=1;}
/*fin año bisiesto*/
/*control de meses que tienen 31 dias*/
if (diafin==31 && (mesfin==2 || mesfin==4 || mesfin==6 || mesfin==9 || mesfin==11) || (diafin>28 && bisiesto==0))
{error=1;campos=2;
mensaje='MES CON MENOS DE 31 DIAS EN FECHA FINAL';}
/*fin control de meses que tienen 31 dias*/

/*fecha mayor a la actual*/
if(anyoinicio>anyo || anyofin >anyo || diainicio >31 || diafin>31 || mesinicio>12 || mesinicio >12)
{error=1;mensaje='FECHA MAYOR A LA ACTUAL';campos=0;}
/*fin fecha mayor a la actual*/

/*muestra errores*/
if (error==1)
{ switch (campos){
case 0:
Form.fechainicio.focus();
Form.fechainicio.value='';
Form.fechafin.value='';
break;
case 1:
Form.fechainicio.focus();
Form.fechainicio.value='';
break;
case 2:
Form.fechafin.focus();
Form.fechafin.value='';
break;}
alert(mensaje);
return false;}
else {return true;}
}
</SCRIPT>
Por: Esteban
07/3/06
hola, esto es algo parecido, pero en vez de mostrar un pop up, avisa al lado que se debe completar el campo. Salu2

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>Validaciones</title>
</head>

<body>

<script language=javascript>



function validarFormulario(){

var isNotOk;

//validación nombre

var nombre = window.document.formValidar.nombre.value;
if (nombre==""){

document.getElementById("name").style.display="inline";
//window.document.formValidar.nombre.focus();
//return 0;
isNotOk=true;

}
else{

document.getElementById("name").style.display="none";

}

//validación apellido

var apellido = window.document.formValidar.apellido.value;
if (apellido==""){

document.getElementById("lastName").style.display="inline";
//window.document.formValidar.apellido.focus();
//return 0;
isNotOk=true;
}
else{

document.getElementById("lastName").style.display="none";
}

//validación calle

var calle = window.document.formValidar.calle.value;
if (calle==""){

document.getElementById("street").style.display="inline";
//window.document.formValidar.calle.focus();
//return 0;
isNotOk=true;
}
else{

document.getElementById("street").style.display="none";
}


//validación nro de calle
var numero;
numero= window.document.formValidar.numero.value;
if (isNaN(numero) || (numero=="")){

document.getElementById("number").style.display="inline";

//window.document.formValidar.numero.focus();
//return 0;
isNotOk=true;

}
else{

document.getElementById("number").style.display="none";
}


if (isNotOk){
return 0;


}
else{
window.document.formValidar.submit();
}



}
</script>

<form name="formValidar" >

<table>

<tr>
<td>Nombre:</td>
<td>
<input type=text name="nombre" maxlength=20></td>
<td>
<div id="name" style="display:none; color:red">&nbsp;Nombre inválido</div>
</td>
</tr>
<tr>
<td>Apellido:</td>
<td>
<input type=text name="apellido" maxlength=20></td>
<td>

<div id="lastName" style="display:none; color:red">&nbsp;Apellido inválido</div>

</td>

</tr>
<tr>
<td>Calle:</td>
<td>
<input type=text name="calle" maxlength=20></td>
<td>

<div id="street" style="display:none; color:red">&nbsp;Calle inválida</div>

</td>


</tr>

<tr>
<td>Número:</td>
<td>
<input type=text name="numero" maxlength=5 ></td>
<td>

<div id="number" style="display:none; color:red">&nbsp;Número inválido</div>

</td>



</tr>

<tr><td>
<input type=button value=Enviar onclick="validarFormulario()">
</tr></td>


</table>

</form>
</body>
</html>
Por: jorge
26/4/07
El script es muy util pero si tiene errores ya que despues de mandar el mensaje de error se envia la pagina a su destino, esto debido a que en el form action="" es la siguiente página donde ira esta información del formulario. seria interesante poner esta validacion precisamente con el action.

Saludos
Por:
26/12/07
en la funcion para validar el nombre hace falta el paréntesis que contiene todo el codigo.

function valida_envia(){
//valido el nombre
if (document.fvalida.nombre.value.length==0){
alert("Tiene que escribir su nombre")
document.fvalida.nombre.focus()
return 0;
}
} <---- si no la funcion no hara nada

seguramente muchos lo habran notado pero es importante hacerlo ver dado que mucha gente es principiante (yo mismo empece a programar gracias a este sitio)
Saludos :D

tradesh...
Cambiar funcion
15/7/09
Hola. Estoy comenzando a comprender o tratando de hacerlo en realidad, la programacion de formularios con Javascript. Por ello pregunto ¿por cual funcion se cambiaria la funcion de validar la edad, que si bien tiene dos partes se podria reducir a una, por la funcion de validar email y como sería esta funcion? Muy agradecido desde ya.

MAYUS
crear pdf
28/9/09
hola....
estoy haciendo un formulario,,, necesito crear un pdf con numero cedula, nombre y un pin,,,,, como hago para realizar este pdf desde dreamwaver con los datos que se han insertado en el formulario....

Agradezco el que me pueda colaborarr...
gracias

Manuales relacionados
Categorias relacionadas
El autor
Lectura recomendada
Compra este libro en Agapea, la librería urgente a domicilio.
Últimas noticias
Alojados en el grupo
Copyright | Publicidad | Acerca de | Datos legales | Contacta