2009-04-30 14 views
8

Me siguiente código:formulario de envío no se detiene en jquery ajax llamada

$.ajax({ 
    type: "POST", 
    async: false,    
    url: "CheckIdExist", 
    data: param, 
    success: function(result) { 
     if (result == true){ 
      return false; 
     }         
    }, 
    error: function(error) { 
     alert(error); 
     return false; 
    } 
}); 

si el valor de retorno Ajax es cierto, la forma tiene que dejar de enviar.

pero no se detiene enviando formulario.

ayuda por favor.

Respuesta

1

En este caso, debe realizar una solicitud HTTP síncrona, es decir, debe establecer the async option en falso.
En su versión, httpxmlrequest es asincrónico. Puede finalizar mucho después de que su controlador onsubmit haya regresado y la invocación onsuccess se invoque fuera del contexto del controlador onsubmit.
El "retorno falso" será el valor de retorno de la función de función anónima (resultado) {...} y no el valor de retorno del controlador onsubmit.

2

Debe realizar una devolución de llamada.

This entry in the FAQ me ayudó mucho cuando tuve este problema exacto.

getUrlStatus('getStatus.php', function(status) { 
    alert(status); 
}); 

function getUrlStatus(url, callback) { 
    $.ajax({ 
     url: url, 
     complete: function(xhr) { 
      callback(xhr.status); 
     } 
    }); 
} 

La razón de esto es que no puede regresar en una función AJAX.

El código anterior no funciona como se desee debido a la naturaleza de la programación asincrónica. El controlador de éxito proporcionado no se invoca inmediatamente, sino en algún momento en el futuro cuando se recibe la respuesta del servidor. Entonces, cuando usamos la variable 'status' inmediatamente después de la llamada $ .ajax, su valor aún no está definido.

1

No puede poner este código en una función o en el envío de un formulario, la función de éxito devuelve su resultado volviendo al contexto jQuery ajax, NO al contexto de envío de formulario.

+0

Parte del problema, pero principalmente el problema es que la función ajax es asíncrona y por lo tanto no puede devolver un valor porque la ejecución del código no espera a que se complete esta función. – Sylverdrag

15

supongo que tienes algo como:

form.submit(function(event) { 
    $.ajax(...); 
}); 

¿Quieres return false (o llama event.preventDefault()) en el caso de la función de manejo de sí mismo, y no en la llamada AJAX, tales como:

form.submit(function(event) { 
    $.ajax(...); 
    event.preventDefault(); 
}); 
+2

Excelente: el uso de event.preventDefault() resolvió mi problema y evitó que una página se actualice cuando el usuario hace clic en un botón de mi formulario. Gracias DarkWulf! –

+0

no funciona para jquery 1.8.3 –

1

Tuve este problema también pero lo resolví cambiando el tipo de entrada = "enviar" a tipo = "botón" y luego simplemente haga su solicitud de ajax

$("input#submitbutton") 
    { 
          $.ajax(
         {       type: "POST", 
          async: false,    
          url: "CheckIdExist", 
          data: param, 
          success: function(result) { 
           if (result == true){ 
            //TODO: do you magic 
           }      
           else 
            $("form").submit();   
          }, 
          error: function(error) { 
           alert(error); 
           return false; 
          } 
         }); 
    }); 
7

Una pequeña variación de esta pregunta es: Quiero usar jquery y ajax para presentar un mensaje de error a un usuario, pero luego hacer el procesamiento normal si no hay ningún error.

Supongamos que el método "check" devuelve una respuesta que está vacía si no hay ningún error, y tiene el error (s) si hay alguna.

A continuación, puede hacer algo como esto en su función de lista:

$("#theform").submit(function() { 
    var data = { ... } 
    $.get('/check', data, 
     function(resp) { 
      if (resp.length > 0) { 
       $("#error").html(resp); 
      } else { 
       $("#theform").unbind('submit'); 
       $("#theform").submit(); 
      } 
    }); 
    event.preventDefault(); 
}); 

Así que, ¿cómo funciona?Cuando se activa la función de envío externo, genera los datos necesarios para la llamada AJAX (aquí se obtiene la función de nivel superior). La llamada está programada y el hilo de operación principal continúa de inmediato, pero el envío se detiene de forma incondicional, por lo que no ocurre nada aparente.

Algunos pasa el tiempo, y la llamada AJAX devuelve el resultado de la solicitud. Si no está vacío, el resultado se muestra al usuario.

Si la respuesta está vacía, sin embargo, la función de envío no está vinculada. Esto evita que el sistema realice una llamada adicional a través de la función de envío externo. La función de envío interno se llama. Esto desencadena un envío de formulario real al objetivo del formulario, y la vida continúa como se esperaba.

+0

'form.unbind ('submit')' - brilliant! Mucho más limpio que 'form.trigger ('submit', [algo])' que no funcionó para mí de todos modos. –

+0

Estaba usando google para hacer una llamada de geocodificación asincrónica basada en una de las entradas de mi formulario y estableciendo otros valores basados ​​en la geocodificación. El formulario siempre se envió antes de que terminara la geocodificación. El form.unbind fue realmente útil y resolvió mi problema. – joshcartme

Cuestiones relacionadas