Ver Mensaje Individual
  #2 (permalink)  
Antiguo 14/09/2012, 09:50
kikeking1
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 14 años, 10 meses
Puntos: 17
Respuesta: Pulsar dos veces botón submit.

Tu problema es la A de AJAX, es decir, Asincronimus.

Esto significa que el proceso se ejecuta de forma independiente del flujo de la programación.

Por lo tanto la primera vez que entras en la función, se ejecuta validetaLogin(), que hace la petición a servidor, recibe una respuesta, etc, etc, pues mientras todo esto pasa "en un segundo plano", tu función sigue funcionando, ejecutandose el alert, y el condicional (que como no dio tiempo a definirse b_usr dentro de validateLogin(), sigue manteniendo el valor incial)

Para ver que lo que te digo es cierto, simplemente, donde declaras las variables globales, prueba a ponerle a b_urs el valor "pato", veras como el primer alert que te salta es "pato" el resultado.

Como solucionarlo.. pues haciendo la comprobación en la funciona validateLogin() en si.

Quedaria una cosa asi:

Código:
    $("#signupForm").submit(function(){
        return validateLogin();
    });
Esto captura cuando vamos a enviar el formulario y hara el return de lo que devuelva la funcion (que sera false o true, segun se defina en la función)



Código:
function validateLogin(){
   
        usr = $("#username").val();
        pass = $("#password").val();
            $.ajax({  
            type: "POST",  
            url: "checklogin.php",  
            data: "username=" + usr + "&password=" + pass,
            success: function(msg){  
           
           $("#status").ajaxComplete(function(event, request, settings){
 
            if(msg == 'OK')
            {
                $("#username").removeClass('object_error'); // if necessary
                $("#username").addClass("object_ok");
                $("#status").html('');
                b_usr = true;
            }  
            else
            {  
                $("#username").removeClass('object_ok'); // if necessary
                $("#username").addClass("object_error");
                $(this).html(msg);
                b_usr = false;
            }  
           
        if(b_usr){
            return true;
        }
        else{
            return false;
        }

           });
 
         }



           
          });


    }
y en la función al final del todo (cuando estamos ya en success y con la respuesta recibida [200 o OK]), es cuando provocariamos el return que nos interesa.

Realmente la variable b_usr puede ser completamente prescindible y realizar directamente el return, pero te lo deje para no trastocarte mucho el codigo (y quizas la uses en mas sitio y si la necesites).

Otra cosa aparte de tu cuestión:
Cuando declaras la variables globales en tu script (que no es que tenga que ser globles, puede ser cualquier tipo) estas guardando el objeto al complento dentro de la variable (y has echo un gasto de proceso y memoria, que puedes ahorrar volver a repetir).

Es decir al hacer esto var usr = $("#username"); ahora la variable usr es el objeto completo, por lo que en la función validateLogin() puedes hacer :

Código:
usr.val();
y será el mismo resultado que

Código:
usr = $("#username").val();
La diferencia, que cuando haces $("#username") se realizan una serie de funciones que consumen proceso ya que lo que realmente pasa por las tripas de jquery es que se estan itenerando todos los elementos del dom hasta encontrar el elemento que buscas. Cuando lo guardas en una variables, no estas guardando la orden, si no la busqueda, por lo que directamente accedes al objeto y sus propiedad en vez de tener que buscar el objeto de nuevo.

Bueno espero que te sirva la ayuda y no me haya esquivocado mucho al editar el codigo ya que lo hice directamente en el post.

Un saludo y ya nos comentas.