Quiero activar una solicitud ajax cuando el usuario haya terminado de escribir en un cuadro de texto. No quiero que ejecute la función cada vez que el usuario escribe una letra porque eso generaría MUCHAS solicitudes de ajax, sin embargo, tampoco quiero que tengan que presionar el botón Intro.
¿Hay alguna manera de que pueda detectar cuándo el usuario ha terminado de escribir y luego hacer la solicitud ajax?
Usando jQuery aquí! Dave
javascript
jquery
keyboard
David Zorychta
fuente
fuente
Respuestas:
Entonces, supongo que terminar de escribir significa que debes detenerte por un tiempo, digamos 5 segundos. Con eso en mente, comencemos un temporizador cuando el usuario suelte una tecla y la borre cuando presione una. Decidí que la entrada en cuestión será #myInput.
Haciendo algunas suposiciones ...
fuente
doneTyping
en el ejemplo, se ejecuta de inmediato. Eso suele ser el resultado de incluir accidentalmente()
después del nombre de la función. Tenga en cuenta que debe decirsetTimeout(doneTyping,
nosetTimeout(doneTyping(),
La respuesta elegida arriba no funciona.
Debido a que typingTimer se establece ocasionalmente varias veces (pulsación de tecla dos veces antes de que se active la tecla para los tipos rápidos, etc.), entonces no se borra correctamente.
La solución a continuación resuelve este problema y llamará X segundos después de finalizar como lo solicitó el OP. Tampoco requiere más la función redundante de keydown. También he agregado una comprobación para que su llamada a la función no se realice si su entrada está vacía.
Y el mismo código en la solución JavaScript vainilla:
Esta solución usa ES6 pero no es necesaria aquí. Simplemente reemplace
let
convar
y la función de flecha con una función regular.fuente
$('#myInput').on('input', function() {
si desea que esto funcione con copiar y pegar. No veo el punto de la comprobación si la entrada está vacía. Suponiendo que quiere borrar lo que escribió, esto no podrá hacer la llamada ajax.if ($('#myInput').val)
lugar deif ($('#myInput').val())
? Debería.val
ser una función?Es solo una línea con la función underscore.js debounce:
Esto básicamente dice doSomething 500 milisegundos después de que la tipificación de parada.
Para más información: http://underscorejs.org/#debounce
fuente
Uncaught ReferenceError: _ is not defined
Sí, puede establecer un tiempo de espera de, por ejemplo, 2 segundos en todos y cada uno de los eventos de activación de tecla que activará una solicitud ajax. También puede almacenar el método XHR y abortarlo en eventos de pulsación de teclas posteriores para ahorrar aún más ancho de banda. Aquí hay algo que he escrito para un script de autocompletado mío.
Espero que esto ayude,
Marko
fuente
ejemplo completo aquí: http://jsfiddle.net/ZYXp4/8/
fuente
Las dos respuestas principales no funcionan para mí. Entonces, aquí está mi solución:
fuente
Me gusta la respuesta de Surreal Dream, pero descubrí que mi función "doneTyping" se activaría por cada pulsación de tecla, es decir, si escribes "Hola" muy rápido; en lugar de disparar solo una vez cuando dejas de escribir, la función se disparará 5 veces.
El problema era que la función setTimeout de javascript no parece sobrescribir o eliminar los viejos tiempos de espera que se han establecido, pero si lo hace usted mismo, ¡funciona! Así que acabo de agregar una llamada clearTimeout justo antes de setTimeout si typingTimer está configurado. Vea abajo:
Nota: me hubiera gustado haber agregado esto como un comentario a la respuesta de Surreal Dream, pero soy un usuario nuevo y no tengo suficiente reputación. ¡Lo siento!
fuente
Modificando la respuesta aceptada para manejar casos adicionales como pegar:
fuente
No creo que el evento keyDown sea necesario en este caso (dígame por qué si me equivoco). En mi script (no jquery), una solución similar se ve así:
Es mi primera respuesta en Stack Overflow, así que espero que esto ayude a alguien, algún día :)
fuente
Declare la siguiente
delay
función:y luego úsalo:
fuente
Respuesta tardía, pero la agrego porque es 2019 y esto se puede lograr completamente usando ES6 bonito, sin bibliotecas de terceros, y encuentro que la mayoría de las respuestas altamente calificadas son voluminosas y pesadas con demasiadas variables.
Elegante solución tomada de esta excelente publicación de blog.
fuente
Bueno, estrictamente hablando no, ya que la computadora no puede adivinar cuándo el usuario ha terminado de escribir. Por supuesto, podría disparar un temporizador al presionar la tecla hacia arriba y restablecerlo en cada tecla subsiguiente. Si el temporizador caduca, el usuario no ha escrito durante la duración del temporizador; podría llamarlo "finalización de la escritura".
Si espera que los usuarios hagan pausas mientras escriben, no hay forma de saber cuándo terminan.
(A menos que, por supuesto, se pueda distinguir de los datos cuando hayan terminado)
fuente
Siento que la solución es algo más simple con el
input
evento:fuente
de acuerdo con la respuesta de @going. Otra solución similar que funcionó para mí es la siguiente. La única diferencia es que estoy usando .on ("input" ...) en lugar de keyup. Esto solo captura cambios en la entrada. otras teclas como Ctrl, Shift, etc. se ignoran
fuente
Acabo de descubrir un código simple para esperar a que el usuario termine de escribir:
paso 1: establece el tiempo de espera en nulo y luego borra el tiempo de espera actual cuando el usuario está escribiendo.
paso 2: activa el tiempo de espera claro para la variable definir antes de que se active el evento keyup.
paso 3: definir el tiempo de espera para la variable declarada anteriormente;
código javascript
fuente
Estaba implementando la búsqueda en mi listado y necesitaba que se basara en ajax. Eso significa que en cada cambio clave, los resultados buscados deben actualizarse y mostrarse. Esto da como resultado tantas llamadas ajax enviadas al servidor, lo que no es bueno.
Después de trabajar un poco, hice un enfoque para hacer ping al servidor cuando el usuario deja de escribir.
Esta solución funcionó para mí:
Notarás que no es necesario usar ningún temporizador al implementar esto.
fuente
Este es un código JS simple que escribí:
fuente
Puede usar el evento onblur para detectar cuándo el cuadro de texto pierde el foco: https://developer.mozilla.org/en/DOM/element.onblur
Eso no es lo mismo que "deja de escribir", si le importa el caso en el que el usuario escribe un montón de cosas y luego se sienta allí con el cuadro de texto aún enfocado.
Para eso, sugeriría vincular un setTimeout al evento onclick, y asumir que después de x cantidad de tiempo sin presionar las teclas, el usuario ha dejado de escribir.
fuente
¿Por qué no solo usar onfocusout?
https://www.w3schools.com/jsreF/event_onfocusout.asp
Si se trata de un formulario, siempre dejarán el foco de cada campo de entrada para hacer clic en el botón de envío para que sepa que ninguna entrada se perderá al llamar a su controlador de eventos onfocusout.
fuente
Si es necesario que el usuario se aleje del campo, podemos usar "onBlur" en lugar de Onchange en Javascript
Si eso no es necesario, configurar el temporizador sería la buena opción.
fuente
Una vez que detecte el foco en el cuadro de texto, al presionar la tecla, verifique el tiempo de espera y reinícielo cada vez que se active.
Cuando finalice el tiempo de espera, haga su solicitud ajax.
fuente
Si está buscando una longitud específica (como un campo de código postal):
fuente
No estoy seguro de si mis necesidades son un poco raras, pero necesitaba algo similar a esto y esto es lo que terminé usando:
Lo que me permite tener elementos como este en mi aplicación:
Que se actualizan cuando el usuario "termina de escribir" (sin acción durante 2 segundos) o pasa a otro campo (se borra del elemento)
fuente
Si necesita esperar hasta que el usuario termine de escribir, use esto:
Ejemplo completo con llamada ajax - esto funciona para mi buscapersonas - recuento de elementos por lista:
fuente
Múltiples temporizadores por página
Todas las otras respuestas solo funcionan para un control ( incluida mi otra respuesta ). Si tiene varios controles por página (por ejemplo, en un carrito de compras), solo se llamará al último control donde el usuario escribió algo. . En mi caso, este no es el comportamiento deseado: cada control debe tener su propio temporizador.
Para resolver esto, simplemente tiene que pasar una ID a la función y mantener un diccionario timeoutHandles como en el siguiente código:
Declaración de funciones:
Uso de la función:
fuente
Simple y fácil de entender.
fuente
Para pasar parámetros a su función junto con la sintaxis de ES6.
fuente
¡Guau, incluso 3 comentarios son bastante correctos!
La entrada vacía no es una razón para omitir la llamada a la función, por ejemplo, elimino el parámetro de desperdicio de la URL antes de redirigir
.on ('input', function() { ... });
debe usarse para desencadenarkeyup
,paste
ychange
eventosdefinitivamente
.val()
o.value
debe ser utilizadoPuede usar la
$(this)
función de evento interno en lugar de#id
trabajar con múltiples entradas(mi decisión) utilizo función anónima en lugar de
doneTyping
ensetTimeout
forma fácil acceso$(this)
desde n.4, pero hay que guardarlo primero comovar $currentInput = $(this);
EDITAR Veo que algunas personas no entienden las instrucciones sin la posibilidad de copiar y pegar el código listo. Aqui estas
fuente
paste
, no usathis
, etc. (Creo que es importante pero no quiero