Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Pulsar dos veces botón submit.

Estas en el tema de Pulsar dos veces botón submit. en el foro de Frameworks JS en Foros del Web. Hola, he hecho un formulario de login con sus validaciones y cuando pulso el boton submit, lo valida pero no hace el action del form, ...
  #1 (permalink)  
Antiguo 14/09/2012, 04:21
 
Fecha de Ingreso: enero-2012
Ubicación: En españa dije...
Mensajes: 28
Antigüedad: 12 años, 10 meses
Puntos: 1
Pulsar dos veces botón submit.

Hola, he hecho un formulario de login con sus validaciones y cuando pulso el boton submit, lo valida pero no hace el action del form, es decir que no va a la página de bienvenida y tengo que pulsar otra vez el botón.

Este es mi código de validación.

EDITADO: He agregado la línea 48 para comprobarlo.

Código Javascript:
Ver original
  1. $(document).ready(function(){
  2.    
  3.     //Variables globales
  4.     var usr = $("#username");
  5.     var pass = $("#password");
  6.     var b_usr = false;
  7.  
  8.     //Username Check
  9.     function validateLogin(){
  10.    
  11.         usr = $("#username").val();
  12.         pass = $("#password").val();
  13.             $.ajax({  
  14.             type: "POST",  
  15.             url: "checklogin.php",  
  16.             data: "username=" + usr + "&password=" + pass,
  17.             success: function(msg){  
  18.            
  19.            $("#status").ajaxComplete(function(event, request, settings){
  20.  
  21.             if(msg == 'OK')
  22.             {
  23.                 $("#username").removeClass('object_error'); // if necessary
  24.                 $("#username").addClass("object_ok");
  25.                 $("#status").html('');
  26.                 b_usr = true;
  27.             }  
  28.             else
  29.             {  
  30.                 $("#username").removeClass('object_ok'); // if necessary
  31.                 $("#username").addClass("object_error");
  32.                 $(this).html(msg);
  33.                 b_usr = false;
  34.             }  
  35.            
  36.            });
  37.  
  38.          }
  39.            
  40.           });
  41.     }
  42.  
  43.    
  44.     //Validation on submit.
  45.     // Envio de formulario  
  46.     $("#signupForm").submit(function(){
  47.         validateLogin();
  48.           alert(b_usr);
  49.         if(b_usr){
  50.             return true;
  51.         }
  52.         else{
  53.             return false;
  54.         }
  55.     });
  56.    
  57. });

La primera vez que pulso 'b_usr' es falso, y la segunda vez que pulso verdadero (en caso de que ponga un user y password correctos claro).

¿Por qué ocurre eso?

Gracias de antemano.

Última edición por mandibula120; 14/09/2012 a las 04:33
  #2 (permalink)  
Antiguo 14/09/2012, 09:50
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 15 años, 6 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.

Etiquetas: ajax, formulario, html, php, pulsar, veces
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 04:40.