Desejo acionar uma solicitação ajax quando o usuário terminar de digitar em uma caixa de texto. Eu não quero que ele execute a função toda vez que o usuário digita uma letra, porque isso resultaria em MUITAS solicitações de ajax, no entanto, não quero que eles precisem pressionar o botão Enter também.
Existe uma maneira de detectar quando o usuário terminou de digitar e depois fazer a solicitação ajax?
Usando jQuery aqui! Dave
javascript
jquery
keyboard
David Zorychta
fonte
fonte
Respostas:
Então, acho que terminar de digitar significa que você apenas pára por um tempo, digamos 5 segundos. Portanto, com isso em mente, vamos iniciar um timer quando o usuário soltar uma tecla e limpá-la quando pressionar uma. Decidi que a entrada em questão será #myInput.
Fazendo algumas suposições ...
fonte
doneTyping
no exemplo, está sendo executada imediatamente. Isso geralmente é resultado da inclusão acidental()
após o nome da função. Note que ele deve lersetTimeout(doneTyping,
nãosetTimeout(doneTyping(),
A resposta escolhida acima não funciona.
Como o TypingTimer é ocasionalmente definido várias vezes (a tecla pressionada duas vezes antes de a tecla pressionada ser acionada para digitadores rápidos etc.), ela não é limpa corretamente.
A solução abaixo resolve esse problema e chama X segundos após o término, conforme solicitado pelo OP. Também não requer mais a função redundante de pressionamento de tecla. Também adicionei uma verificação para que sua chamada de função não aconteça se sua entrada estiver vazia.
E o mesmo código na solução JavaScript vanilla:
Esta solução usa o ES6, mas não é necessária aqui. Basta substituir
let
porvar
e a função de seta por uma função regular.fonte
$('#myInput').on('input', function() {
se você quiser que isso funcione com copiar e colar. Não vejo o ponto da verificação se a entrada está vazia. Supondo que ele queira apagar o que digitou, isso falhará na chamada ajax.if ($('#myInput').val)
vez deif ($('#myInput').val())
? Deve.val
ser uma função?É apenas uma linha com a função de rebaixo underscore.js :
Isso basicamente diz: Algo 500 milissegundos depois que eu paro de digitar.
Para mais informações: http://underscorejs.org/#debounce
fonte
Uncaught ReferenceError: _ is not defined
Sim, você pode definir um tempo limite de, digamos, 2 segundos em cada evento de ativação de tecla que acionará uma solicitação ajax. Você também pode armazenar o método XHR e abortá-lo nos eventos de pressionamento de tecla subseqüentes, para economizar ainda mais a banda. Aqui está algo que eu escrevi para um script de preenchimento automático meu.
Espero que isto ajude,
Marko
fonte
exemplo completo aqui: http://jsfiddle.net/ZYXp4/8/
fonte
As duas principais respostas não funcionam para mim. Então, aqui está a minha solução:
fonte
Gosto da resposta do Surreal Dream, mas descobri que minha função "doneTyping" seria acionada a cada pressionamento de tecla, ou seja, se você digitar "Hello" muito rapidamente; em vez de disparar apenas uma vez quando você para de digitar, a função dispara 5 vezes.
O problema era que a função setTimeout do javascript não parece substituir ou eliminar os tempos limite antigos que foram definidos, mas se você fizer isso sozinho, funcionará! Então, acabei de adicionar uma chamada clearTimeout imediatamente antes do setTimeout se o typTimer estiver definido. Ver abaixo:
NB: Eu gostaria de ter adicionado isso como um comentário à resposta do Surreal Dream, mas sou um usuário novo e não tenho reputação suficiente. Desculpa!
fonte
Modificando a resposta aceita para lidar com casos adicionais, como colar:
fonte
Eu não acho que o evento keyDown seja necessário neste caso (por favor, me diga por que se eu estiver errado). No meu script (não-jquery), solução semelhante é assim:
É a minha primeira resposta no Stack Overflow, então espero que isso ajude alguém, algum dia :)
fonte
Declare a seguinte
delay
função:e depois use-o:
fonte
Resposta tardia, mas estou adicionando porque é 2019 e isso é totalmente possível usando o ES6, sem bibliotecas de terceiros, e acho que a maioria das respostas altamente classificadas é volumosa e sobrecarregada com muitas variáveis.
Solução elegante retirada deste excelente post no blog.
fonte
Bem, a rigor, não, pois o computador não consegue adivinhar quando o usuário terminou de digitar. Obviamente, você pode acionar um cronômetro ao pressionar a tecla e redefini-lo a cada tecla subsequente. Se o timer expirar, o usuário não digitou a duração do timer - você pode chamar isso de "digitação concluída".
Se você espera que os usuários façam pausas durante a digitação, não há como saber quando elas terminam.
(A não ser, é claro, que você saiba dos dados quando eles forem concluídos)
fonte
Eu sinto que a solução é um pouco mais simples com o
input
evento:fonte
concorde com a resposta do @ going. Outra solução semelhante que funcionou para mim é a abaixo. A única diferença é que estou usando .on ("input" ...) em vez de keyup. Isso captura apenas as alterações na entrada. outras teclas como Ctrl, Shift etc. são ignoradas
fonte
Acabei de descobrir um código simples para aguardar o usuário terminar de digitar:
etapa 1. defina o tempo limite como nulo e limpe o tempo limite atual quando o usuário estiver digitando.
passo 2. desencadeie o tempo limite para a variável definir antes que o evento de keyup seja acionado.
etapa 3.define o tempo limite para a variável declarada acima;
código javascript
fonte
Eu estava implementando a pesquisa na minha listagem e precisava que ela fosse baseada no ajax. Isso significa que, a cada mudança de chave, os resultados pesquisados devem ser atualizados e exibidos. Isso resulta em muitas chamadas ajax enviadas ao servidor, o que não é uma coisa boa.
Depois de algum trabalho, fiz uma abordagem para executar ping no servidor quando o usuário para de digitar.
Esta solução funcionou para mim:
Você notará que não há necessidade de usar nenhum timer durante a implementação.
fonte
Este é o código JS simples que escrevi:
fonte
Você pode usar o evento onblur para detectar quando a caixa de texto perde o foco: https://developer.mozilla.org/en/DOM/element.onblur
Isso não é o mesmo que "para de digitar", se você se importa com o caso em que o usuário digita várias coisas e fica sentado com a caixa de texto ainda focada.
Para isso, sugiro vincular um setTimeout ao evento onclick e supor que após x quantidade de tempo sem pressionar as teclas, o usuário parou de digitar.
fonte
Por que não usar o onfocusout?
https://www.w3schools.com/jsreF/event_onfocusout.asp
Se for um formulário, eles sempre deixarão o foco de todos os campos de entrada para clicar no botão enviar para que você saiba que nenhuma entrada perderá a chamada de seu manipulador de eventos onfocusout.
fonte
Se for necessário que o usuário se afaste do campo, podemos usar "onBlur" em vez de Onchange em Javascript
Se isso não for necessário, definir o temporizador seria a boa opção.
fonte
Depois de detectar o foco na caixa de texto, na tecla para cima, faça uma verificação de tempo limite e redefina-a sempre que for acionada.
Quando o tempo limite terminar, faça sua solicitação de ajax.
fonte
Se você estiver procurando por um comprimento específico (como um campo de CEP):
fonte
Não tenho certeza se minhas necessidades são meio estranhas, mas eu precisava de algo semelhante a isso e foi isso que acabei usando:
O que me permite ter elementos como este no meu aplicativo:
Que são atualizados quando o usuário "termina de digitar" (sem ação por 2 segundos) ou passa para outro campo (desfoque o elemento)
fonte
Se você precisar esperar até que o usuário termine de digitar, use simples:
Exemplo completo com chamada ajax - funcionando para meu pager - contagem de itens por lista:
fonte
Vários temporizadores por página
Todas as outras respostas funcionam apenas para um controle ( minha outra resposta incluída). Se você tiver vários controles por página (por exemplo, em um carrinho de compras), apenas o último controle em que o usuário digitou algo será chamado . No meu caso, esse certamente não é o comportamento desejado - cada controle deve ter seu próprio cronômetro.
Para resolver isso, basta passar um ID para a função e manter um dicionário timeoutHandles como no código a seguir:
Declaração de Função:
Uso da função:
fonte
Simples e fácil de se entender.
fonte
Para passar parâmetros para sua função junto com a sintaxe ES6.
fonte
Uau, até 3 comentários são bastante corretos!
A entrada vazia não é um motivo para ignorar a chamada de função, por exemplo, removo o parâmetro de desperdício da url antes de redirecionar
.on ('input', function() { ... });
deve ser usado para dispararkeyup
,paste
echange
eventosdefinitivamente
.val()
ou.value
deve ser usadoVocê pode usar a
$(this)
função de evento interno em vez de#id
trabalhar com várias entradas(a minha decisão) Eu uso função anônima em vez de
doneTyping
emsetTimeout
facilmente acesso$(this)
a partir n.4, mas você precisa salvá-lo primeiro comovar $currentInput = $(this);
EDIT Vejo que algumas pessoas não entendem instruções sem a possibilidade de copiar e colar o código pronto. Aqui você está
fonte
paste
, ele não usathis
, etc. (eu acho que é importante, mas eu não quero ficar perdido em toneladas de comentários)