2009-11-30 28 views
66

Tengo algunos problemas con el control de jQuery que hicimos. Supongamos que tiene una lista desplegable que le permite ingresar el ID del artículo que está buscando, y cuando presiona ENTRAR o pierde el foco en un cuadro de texto, valida a través de jQuery que el ID que ingresó es correcto, mostrando una alerta si no lo hace 't.¿Cómo puedo saber si jQuery tiene pendiente una solicitud de Ajax?

El caso es que cuando un usuario ordinario ingresa un valor no válido en él y pierde el foco al presionar el botón de enviar, la publicación jQuery vuelve después de que se haya enviado el formulario.

¿Hay alguna manera de que pueda verificar si hay jpeg de procesamiento de solicitud Async para que no permita el envío del formulario?

Respuesta

31

Puede usar ajaxStart y ajaxStop para realizar un seguimiento de cuándo las solicitudes están activas.

+0

Esto funcionó mejor para mí, ya que mi control se representaba muchas veces con HtmlHelper. ¡Gracias! – sabanito

10

La función $ .ajax() devuelve un objeto XMLHttpRequest. Almacene eso en una variable que sea accesible desde el evento "OnClick" del botón Enviar. Cuando un clic se procesa presentar comprobación para ver si la variable es XMLHttpRequest:

1) nulo, lo que significa que no hay petición ha sido enviada todavía

2) que el valor es readyState 4 (cargado). Esto significa que la solicitud ha sido enviada y devuelta con éxito.

En cualquiera de esos casos, devuelva verdadero y permita que el envío continúe. De lo contrario, devuelve false para bloquear el envío y dale al usuario alguna indicación de por qué su envío no funcionó. :)

+3

Comprobación de nula para determinar si existe el objeto de solicitud es importante, pero si no es nulo usted debe realmente compruebe 'request.readyState> 0 && request.readyState <4' para determinar una solicitud 'activa' porque readyState 0 indica que aunque th El objeto ha sido creado, no se ha iniciado una solicitud web. –

190

$.active devuelve el número de solicitudes de Ajax activas.

Más información here

+0

Esto realmente responde la pregunta. Gracias. –

+0

Una solución liviana y corta muy buena – MSTdev

23
$(function() { 
     function checkPendingRequest() { 
      if ($.active > 0) { 
       window.setTimeout(checkPendingRequest, 1000); 
       //Mostrar peticiones pendientes ejemplo: $("#control").val("Peticiones pendientes" + $.active); 
      } 
      else { 

       alert("No hay peticiones pendientes"); 

      } 
     }; 

     window.setTimeout(checkPendingRequest, 1000); 
}); 
+0

Parece una buena solución pero, ¿Ha detectado algún problema con el "Tamaño máximo de pila de llamadas"? – Mikel

0

Este método utiliza el violín $ .ajax.abort() para cancelar la solicitud si está activo. Utiliza la propiedad readyState para verificar si la solicitud está activa o no.

Esta es Working Fiddle

HTML

<h3>Cancel Ajax Request on Demand</h3> 
<div id="test"></div> 
<input type="button" id="btnCancel" value="Click to Cancel the Ajax Request" /> 

Código JS

//Initial Message 
var ajaxRequestVariable; 
$("#test").html("Please wait while request is being processed.."); 

//Event handler for Cancel Button 
$("#btnCancel").on("click", function(){ 
if (ajaxRequestVariable !== undefined) 

if (ajaxRequestVariable.readyState > 0 && ajaxRequestVariable.readyState < 4) 
{ 
    ajaxRequestVariable.abort(); 
    $("#test").html("Ajax Request Cancelled."); 
} 
}); 

//Ajax Process Starts 
ajaxRequestVariable = $.ajax({ 
      method: "POST", 
      url: '/echo/json/', 
      contentType: "application/json", 
      cache: false, 
      dataType: "json", 
      data: { 
     json: JSON.encode({ 
     data: 
      [ 
          {"prop1":"prop1Value"}, 
        {"prop1":"prop2Value"} 
        ]   
     }), 
     delay: 11 
    }, 

      success: function (response) { 
      $("#test").show(); 
      $("#test").html("Request is completed");   
      }, 
      error: function (error) { 

      }, 
      complete: function() { 

      } 
     }); 
Cuestiones relacionadas