feed twitter facebook LinkedIn facebook

AJAX » Validar usuario usando AJAX

marzo 27, 2008 por Víctor Cuervo 28 Comentarios Imprimir Imprimir

AJAX podemos verlo como un paradigma de programación Web. Resumiéndolo podemos decir que permite la recarga de datos de la página sin necesidad de una recarga total de la misma. No debemos de tomarnos dicho paradigma como la solución a todos nuestros problemas de rendimiento. Sobre todo porque existen ciertos escenarios donde AJAX complica el diseño de una manera desmesurada.

Si bien, en ciertas ocasiones puede ser algo muy útil. Uno de los ejemplos prácticos es la validación de los datos del formulario. Cuando vamos a recuperar información del usuario podemos utilizar JavaScript de una forma muy potente para validar la información introducida. Por ejemplo podemos validar los tamaños del texto introducido, si cumple algún patrón, si son números o fechas validar rangos y límites,...

Pero todo tiene un límite. Y el límite de las validaciones del cliente es cuando queremos validar lógica de negocio. Me explico, podemos pedirle al usuario que tecleé su usuario y querer validar si existe dicho usuario en nuestra base de datos. Sería algo poco sensato el tener descargado en el cliente el listado entero de usuarios para saber si el dato introducido es correcto o no.

Es en estos casos cuando el paradigma AJAX nos da una gran potencia ya que podemos ir de forma asíncrona al servidor de negocio y validar si existe el dato introducido. De tal manera podemos avisar al usuario de forma rápida si su nombre es válido o no.

En este ejemplo vamos a ver cómo usar el paradigma AJAX para validar si el usuario introducido por pantalla ya le tenemos dado de alta en nuestras bases de datos. Algo muy útil en un formulario de alta de usuarios.

Creando el formulario y la capa oculta

Lo primero que tenemos que hacer es crear la página con el formulario. Tarea simple. ¿Quién no conoce el uso de la etiqueta FORM?

  1. <form name="form1" method="post" action="">
  2.  
  3. <label for="usuario">Usuario:</label>
  4. <input type="text" id="usuario">
  5.  
  6. <input type="submit" name="Submit" value="Enviar">
  7. <input type="reset" name="Submit2" value="Borrar">
  8.  
  9. </form>

El comportamiento que vamos a dar a nuestro formulario es que una vez el usuario haya introducido su usuario vayamos a validarlo al servidor. Si el servidor me dice que ya existe el usuario, entonces deberemos de mostrarle al usuario una ventana diciéndole que ya existe el usuario en la base de datos.

Es por ello que necesitamos dos cosas más en nuestra página web. La primera es capturar el evento onChange del campo de texto del usuario. Es decir, una vez que el usuario tecleé el usuario y vaya a otro campo realizaremos la validación.

  1. <input type="text" id="usuario" onChange="return autentica();">

En el código que acabamos de poner llamaremos a la función JavaScript autentica() que será la que realice la validación asíncrona.

La segunda necesidad es la de tener una capa, oculta al principio, donde se le diga al usuario que su usuario ya está ocupado. Dicha capa la mostraremos si la respuesta del servidor es que si está ocupado y la ocultaremos nuevamente si la validación da un resultado positivo.

  1. <span id="error" style="font-family: Verdana, Arial,
  2. Helvetica, sans-serif; font-size: 12pt;color: #CC3300;
  3. position:relative;visibility:hidden;">
  4. usuario Ocupado ¡¡¡
  5. </span>

Función Autentica

Como hemos indicado en el párrafo anterior, la función autentica() será la que realice la petición asíncrona al servidor.

Dentro de la función lo que haremos serán tres cosas:

  1. Recuperar el valor del usuario introducido por el usuario.
  2. Montar la url del servidor donde el valor del usuario irá como parámetro.
  3. Llamar a la función leer_doc(url) que es la que se encarga únicamente de realizar la petición a la URL indicada como parámetro.
  1. function autentica(){
  2. usuario = document.getElementById("usuario").value;
  3. url = "/samples/existeusuario.php?usuario=" + usuario;
  4. leer_doc(url);
  5. }

Petición XMLHttpRequest

Para realizar la llamada al servidor vamos a crear una variable request que será la que en toda la vida del programa JavaScript mantenga la referencia a la petición.

  1. var req;

Dicha variable será la que dentro de la función leer_doc(url) realice la conexión mediante el objeto XMLHttpRequest.

El objeto XMLHttpRequest tiene dos formas de llamarse dependiendo del navegador en el que nos encontremos (que raro). Si existe el objeto como objeto del navegador bastará con realizar un new sobre el mismo, sino tendremos que instanciarlo como un ActiveX para los navegadores Internet Explorer (versiones 5 y 6). Quedándonos el siguiente código:

  1. if (window.XMLHttpRequest) {
  2. req = new XMLHttpRequest();
  3. } else if (window.ActiveXObject) {
  4. req = new ActiveXObject("Microsoft.XMLHTTP");
  5. }

XMLHttpRequest y Callback

El objeto XMLHttpRequest se maneja mediante callbacks. ¿Qué quiere decir esto? Que la respuesta del objeto será manipulada por la función que le indiquemos. Para ello tendremos que informar a la variable .onreadystatechange

En nuestro caso será la función procesarRespuesta la que analice la respuesta.

Lo que nos quedará será el realizar la petición a la URL previamente montada. Para ello utilizamos el método .open

  1. if(req){
  2. req.onreadystatechange = procesarRespuesta;
  3. req.open('GET', url, true);
  4. req.send(null);
  5. }

Analizando la respuesta: parsear el XML

Una vez retornada la respuesta por el servidor los datos adjuntos a la misma irán a parar a nuestra función de callback procesarRespuesta().

En este caso, y como veremos en un momento, los datos devueltos por el servidor vienen en formato XML. Los datos los recuperaremos del atributo .responseXML del objeto XMLHttpRequest.

Como la respuesta viene en XML deberemos utilizar funciones del DOM para poder ver que valores tienen y actuar en consecuencia. En este caso la función .getElementsByTagName("tag").

Dentro del XML devuelto viene la etiqueta <existe> que tendrá un valor de "true" si el usuario enviado ya existe y un valor de "false" si el valor enviado no existe en la base de datos.

A si que en caso afirmativo pondremos la capa de error de la página a visible (el usuario existe) o la ocultaremos (si el usuario no existe)

  1. function procesarRespuesta(){
  2.  
  3. respuesta = req.responseXML;
  4.  
  5. var existe = respuesta.getElementsByTagName('existe')
  6. .item(0).firstChild.data;
  7.  
  8. if (existe=="true")
  9. document.getElementById("error").style.visibility = "visible";
  10. else
  11. document.getElementById("error").style.visibility = "hidden";
  12. }

Página PHP, ¿Nuestro WebService?

En esto del AJAX pasa a ser algo de vital importancia el uso de servicios web, ya sean WebServices, páginas con script de servidor, CGI o similares.

En nuestro ejemplo la llamada se hace a la http://lineadecodigo.com/samples/existeusuario.php?usuario=miusuario

Es decir, que estamos usando una página PHP.

Dicha página PHP es muy sencilla, y aunque lo suyo sería que fuese a una base de datos, lo que he hecho ha sido devolver un XML estático. Dicho XML solo varía cuando se meta un usuario en concreto ("victor").

  1. <?php
  2.  
  3. $usuario = $_GET["usuario"];
  4.  
  5. header('Content-type: text/xml');
  6.  
  7. if ($usuario != "victor") {
  8. echo("<existe>true</existe>");
  9. } else {
  10. echo("<existe>false</existe>");
  11. }
  12.  
  13. ?>

Ahora que podemos complicar este código cuanto queramos. Acceder a una base de datos,...

Visualizar el ejemplo
|- Descargar el código
|- Descargar del SVN
|- Reportar un error del código

tags:

Artículos relacionados:

28 comentarios »

RSS feed para los comentarios de esta entrada.TrackBack URI

1 2 3
  1. gelbert
    junio 27, 2008 #

    esta muy bueno el manual brou

  2. nicolas
    agosto 26, 2008 #

    exelente explicación, muchas gracias, no entendia nada de ajax ahora comprendo su funcionamiento

  3. luisimnho
    octubre 14, 2008 #

    t pasast men es recontra util ojala hayan + ejemplos…

  4. abel
    octubre 17, 2008 #

    porfavor potria ayudarme como puedo trabajar con las funciones
    function autentica(){ usuario = document.getElementById(“usuario”).value; url = “/samples/existeusuario.php?usuario=” + usuario; leer_doc(url);} como y donde inserto
    para que pueda ejecutarse este ejercio
    M… Dreamweaver 8

  5. Felix
    diciembre 29, 2008 #

    Pilas para la gente que guste de saber mas sobre esto les dejo un articulo muy interesante, es una publicación sobre AJAX ahi les dejo el link:

    http://visid.espol.edu.ec/index.php?option=com_ams&act=publications&task=none&id=29

  6. Alberto
    abril 23, 2009 #

    Hola, gracias por el manual. Tengo una duda, ¿qué hay que hacer evitar enviar la información del formulario si esta no es correcta?

    Saludos

  7. lineadecodigo
    abril 23, 2009 #

    @Alberto, en el ejemplo se está utilizando un input de tipo submit. Este no deja realizar acciones sobre el envío del formulario.

    Si quieres controlar el envío del formulario puedes utilizar un campo button y mediante el evento onClick controlar la validez del formulario y realizar el envío de dicho formulario si este es correcto.

    De todas maneras, intentaré incluir un artículo que explique como controlar el envío de formularios.

  8. Cobain
    agosto 27, 2009 #

    necesito Implementar AJaX con código PHP para realizar validación de usuario, búsqueda de clientes y
    productos sin utilizar botón submit y en tiempo real.Muchas grasias me serviria mucho su ayuda………

  9. Ivan
    septiembre 3, 2009 #

    Hola !! como estan, tengo un problema, el codigo me funciona bien en todos los navegadores menos en el IE de Microsoft y es en el que lo necesito jeje :s.. Les agradesxco

  10. lineadecodigo
    septiembre 9, 2009 #

    @Ivan,

    Lo he probado en un Internet Explorer 8 y funciona correctamente. ¿Qué versión de Internet Explorer estás utilizando?

1 2 3

Deja un comentario

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*