Tengo un campo de búsqueda. En este momento busca cada keyup. Entonces, si alguien escribe "Windows", realizará una búsqueda con AJAX para cada tecla: "W", "Wi", "Win", "Wind", "Windo", "Window", "Windows".
Quiero tener un retraso, por lo que solo busca cuando el usuario deja de escribir durante 200 ms.
No hay ninguna opción para esto en la keyup
función, y lo he intentado setTimeout
, pero no funcionó.
¿Cómo puedo hacer eso?
javascript
jquery
ajsie
fuente
fuente
Respuestas:
Utilizo esta pequeña función para el mismo propósito, ejecutando una función después de que el usuario ha dejado de escribir durante un período de tiempo especificado o en eventos que se disparan a una velocidad alta, como
resize
:Cómo funciona:
La
delay
función devolverá una función ajustada que maneja internamente un temporizador individual; en cada ejecución, el temporizador se reinicia con el tiempo de retraso provisto; si ocurren varias ejecuciones antes de que pase este tiempo, el temporizador simplemente se reiniciará y comenzará nuevamente.Cuando finalmente termina el temporizador, se ejecuta la función de devolución de llamada, pasando el contexto y los argumentos originales (en este ejemplo, el objeto de evento de jQuery y el elemento DOM como
this
).ACTUALIZACIÓN 2019-05-16
He vuelto a implementar la función utilizando las funciones de ES5 y ES6 para entornos modernos:
La implementación está cubierta con un conjunto de pruebas .
Para algo más sofisticado, eche un vistazo al complemento jQuery Typewatch .
fuente
Si desea buscar después de que el tipo haya terminado, use una variable global para retener el tiempo de espera devuelto por su
setTimout
llamada y cancélelo con unclearTimeout
si aún no ha sucedido para que no se active el tiempo de espera excepto en el últimokeyup
eventoO con una función anónima:
fuente
Otra ligera mejora en la respuesta de CMS. Para permitir fácilmente retrasos por separado, puede usar lo siguiente:
Si desea reutilizar el mismo retraso, simplemente haga
Si desea demoras separadas, puede hacerlo
fuente
someApiCall
todavía se dispara varias veces, ahora solo con el valor final del campo de entrada.También puede mirar underscore.js , que proporciona métodos de utilidad como debounce :
fuente
Basado en la respuesta de CMS, hice esto:
Ponga el siguiente código después de incluir jQuery:
Y simplemente use así:
Cuidado: la variable $ (this) en la función pasada como parámetro no coincide con la entrada
fuente
Retrasar llamadas multifunción usando etiquetas
Esta es la solución con la que trabajo. Retrasará la ejecución en CUALQUIER función que desee . Puede ser la consulta de búsqueda de keydown, tal vez el clic rápido en los botones anteriores o siguientes (que de lo contrario enviaría una solicitud múltiple si se hace clic rápidamente de forma continua, y no se usará después de todo). Esto utiliza un objeto global que almacena cada tiempo de ejecución y lo compara con la solicitud más actual.
Entonces, el resultado es que solo se llamará ese último clic / acción, porque esas solicitudes se almacenan en una cola, que después de X milisegundos se llama si no existe otra solicitud con la misma etiqueta en la cola.
Puede establecer su propio tiempo de retraso (es opcional, por defecto es de 500 ms). Y envíe sus argumentos de función en una "moda de cierre".
Por ejemplo, si desea llamar a la función de abajo:
Para evitar múltiples solicitudes send_ajax, las retrasa usando:
delay_method( "check date", function(){ send_ajax(2); } ,600);
Cada solicitud que use la etiqueta "fecha de verificación" solo se activará si no se realiza ninguna otra solicitud en el plazo de 600 milisegundos. Este argumento es opcional.
Etiqueta de independencia (llamando a la misma función de destino) pero ejecuta ambos:
Resulta en llamar a la misma función pero las retrasa de forma independiente debido a que sus etiquetas son diferentes
fuente
Si a alguien le gusta retrasar la misma función, y sin una variable externa, puede usar el siguiente script:
fuente
Enfoque súper simple, diseñado para ejecutar una función después de que un usuario haya terminado de escribir en un campo de texto ...
fuente
Esta función extiende un poco la función de la respuesta de Gaten para recuperar el elemento:
http://jsfiddle.net/Us9bu/2/
fuente
Me sorprende que nadie mencione el problema con la entrada múltiple en CMS muy bien recortado.
Básicamente, debería definir la variable de retardo individualmente para cada entrada. De lo contrario, si sb coloca el texto en la primera entrada y salta rápidamente a otra entrada y comienza a escribir, ¡NO se llamará a la devolución de llamada para la primera !
Vea el siguiente código con el que vine basado en otras respuestas:
Esta solución mantiene la referencia setTimeout dentro de la variable delayTimer de entrada. También pasa la referencia del elemento a la devolución de llamada como sugiere fazzyx.
Probado en IE6, 8 (comp - 7), 8 y Opera 12.11.
fuente
Esto funcionó para mí cuando retrasé la operación de lógica de búsqueda y verifiqué si el valor es el mismo que se ingresó en el campo de texto. Si el valor es el mismo, sigo adelante y realizo la operación para los datos relacionados con el valor de búsqueda.
fuente
Función de retraso para llamar en cada tecla. Se requiere jQuery 1.7.1 o superior
Uso:
$('#searchBox').keyupDelay( cb );
fuente
Esta es una solución similar a la de los CMS, pero resuelve algunos problemas clave para mí:
Uso:
El código está escrito en un estilo que disfruto, es posible que deba agregar un punto y coma.
Cosas a tener en cuenta:
this
funciona como se esperaba (como en el ejemplo).setTimeout
.La solución que uso agrega otro nivel de complejidad, lo que le permite cancelar la ejecución, por ejemplo, pero esta es una buena base para construir.
fuente
La combinación de la respuesta de CMS con la de Miguel produce una solución robusta que permite retrasos concurrentes.
Cuando necesite retrasar diferentes acciones de forma independiente, use el tercer argumento.
fuente
Sobre la base de la respuesta de CMS, aquí hay un nuevo método de retraso que conserva 'esto' en su uso:
Uso:
fuente
Utilizar
donde expresión es el script que se debe ejecutar y el tiempo de espera es el tiempo de espera en milisegundos antes de que se ejecute; esto NO obstaculiza el script, sino que simplemente retrasa la ejecución de esa parte hasta que finalice el tiempo de espera.
restablecerá / borrará el tiempo de espera para que no ejecute la secuencia de comandos en la expresión (como una cancelación) siempre que aún no se haya ejecutado.
fuente
Basado en la respuesta de CMS, simplemente ignora los eventos clave que no cambian el valor.
fuente
Use el complemento bindWithDelay jQuery:
fuente
fuente
Aquí hay una sugerencia que he escrito que se encarga de múltiples entradas en su formulario.
Esta función obtiene el objeto del campo de entrada, ingrese su código
Esta es la función delayCall real, se encarga de múltiples campos de entrada
Uso:
fuente
Desde ES6 , también se puede usar la sintaxis de la función de flecha .
En este ejemplo, el código retrasa el
keyup
evento durante 400 ms después de que los usuarios terminen de escribir antes de llamar parasearchFunc
realizar una solicitud de consulta.fuente
jQuery :
Javascript puro:
fuente
Echa un vistazo al complemento de autocompletar . Sé que te permite especificar un retraso o un número mínimo de caracteres. Incluso si no termina usando el complemento, mirar el código le dará algunas ideas sobre cómo implementarlo usted mismo.
fuente
Bueno, también hice un código para limitar la solicitud de ajax de alta frecuencia causada por Keyup / Keydown. Mira esto:
https://github.com/raincious/jQueue
Haga su consulta así:
Y enlace evento como este:
fuente
Lo vi hoy un poco tarde, pero solo quiero poner esto aquí en caso de que alguien más lo necesite. simplemente separe la función para que sea reutilizable. el siguiente código esperará 1/2 segundo después de escribir stop.
fuente
Usuario lodash javascript library y uso _.debounce function
fuente
fuente