2011-06-20 21 views
8

Debido al entorno me gustaría restringir esto a algo pequeño y conciso en lugar de un complemento, a menos que sea una extensión que se puede poner en línea aparte de otro código jquery.jquery - ¿Busca en vivo llamadas ajax como tipos de usuario pero con un pequeño retraso?

tengo este código:

$("#txtSearch").live('keyup', function() { 
    LoadList(1)  
}); 

Me gustaría añadir una demora de tal manera que si un usuario debe esperar (como en la tipificación de parada) 0,5 segundos antes de ejecutar una llamada.

Así que, básicamente, si las letras se escriben con menos de X veces entre pulsaciones consecutivas, no se produce ninguna llamada ajax.

¿Hay alguna forma pequeña y concisa de hacer esto con Jquery?

Respuesta

9
$("#txtSearch").live('keyup', function() { 
    var value=$("#txtSearch").val(); 
    setTimeout(function(){ 
      if ($("#txtSearch").val() == value) 
      { 
       LoadList(1)  
      } 
    },500); 
}); 
+2

Para mí cargó la lista dos veces, mientras que la siguiente respuesta con clearTimeout funcionó perfectamente y parecía más limpia. – balrok

+0

Esto realmente activa la función dos veces, porque el tiempo de espera anterior no se restablece. – user1226868

3

Usted puede utilizar el widget de autocompletar en jQueryUI, que tiene una opción de retardo:

El retraso en milisegundos que el autocompletar espera después de pulsar una tecla para activar sí. Un retraso cero tiene sentido para los datos locales (más receptivos), pero puede generar mucha carga para los datos remotos, a la vez que es menos receptivo.

http://jqueryui.com/demos/autocomplete

+0

Vaya, lo siento, no lo leí bien. – Nabab

+0

no es necesario. mira mi respuesta ... Y, OP quería hacerlo sin complementos, pero lo notaste como veo: D – genesis

+0

En realidad debería haber mencionado que Jquery UI es el único plugin disponible :) –

20

Establecer un tiempo de espera y claro en cada golpe de teclado antes de aplicar una nueva:

var timeout; 
$("body").on('keyup', '#txtSearch', function() { 
    window.clearTimeout(timeout); 
    timeout = window.setTimeout(function(){ 
     LoadList(1); 
    },500); 

}); 

ejemplo: http://jsfiddle.net/niklasvh/KgRjJ/

+1

¡Gracias! Busqué en Google por un tiempo y no encontré nada útil hasta este momento. – Benjamin

+1

Según http://api.jquery.com/live/ - A partir de jQuery 1.7, el método .live() está en desuso. Use .on() para adjuntar manejadores de eventos. Los usuarios de versiones anteriores de jQuery deben usar .delegate() en preferencia a .live(). – Lingnik

+0

@Lingnik Correcto, he actualizado mi respuesta en consecuencia. – Niklas