2010-11-12 20 views
12

estoy haciendo una solicitud de ajax usando $ .get tan pronto como el usuario escribe un carácter en el cuadro de entrada quiero abortar las llamadas ajax anteriores y luego hacer la nueva, ¿hay alguna manera?

edición

resuelto!

Acabo de enterarme de que $ .get es una forma abreviada de $ .ajax y, por lo tanto, devuelve un XHR y, por lo tanto, podemos llamar a abortar sobre esa variable.

+0

posible duplicado de [jquery abort() solicitud ajax antes de enviar otro] (http://stackoverflow.com/questions/3312960/jquery-abort-ajax-request-before-sending-another) –

Respuesta

26

Puede usar .abort() en XMLHttpRequest que $.get devuelve.

var req = $.get('ajax/test.html', function(data) { 
      $('.result').html(data); 
      alert('Load was performed.'); 
      }); 

//Abort request 
req.abort() 

De jQuery.ajax() documentación:

La función $ .ajax() devuelve el objeto XMLHttpRequest que crea. Normalmente jQuery maneja la creación de este objeto internamente, pero se puede especificar una función personalizada para fabricar uno usando la opción xhr. El objeto devuelto generalmente se puede descartar, pero proporciona una interfaz de nivel inferior para observar y manipular la solicitud. En particular, al llamar .abort() al objeto detendrá la solicitud antes de que se complete.

Más sobre .abort(): https://developer.mozilla.org/en/XMLHttpRequest#abort

Existe también plugin de jQuery AjaxQueue para el manejo de múltiples petición Ajax realizado en paralelo.

-2

Una mejor manera podría ser establecer un tiempo de espera en la solicitud de ajax, y sobrescribir esa en cada pulsación de tecla, por lo que la solicitud real no se disparará hasta que el usuario deje de escribir durante un segundo. De esta forma no realiza solicitudes innecesarias, y se carga menos tanto en el servidor como en el cliente.

editar un poco más de claridad:

var t = false;  
function makeRequest(){ 
     t = setTimeout(function(){ 
      $.get() // make the request 
     },1000); 
    } 

Llame a la función en cada pulsación de tecla. Si un usuario presiona otra tecla dentro de 1 segundo, el tiempo de espera se sobrescribirá y, al final, solo se disparará si el usuario no presiona una tecla durante 1 segundo.

+0

cómo podría establecer un tiempo de espera en la solicitud de Ajax? – Shaheer

+0

ver mi edición, afortunadamente eso lo borra un poco –

+8

-1 porque está mal. Simplemente sobrescribiendo la variable donde está guardada la ID del temporizador NO se cancela el temporizador anterior. Primero debe hacer 'clearTimeout (t)'. –

Cuestiones relacionadas