Eu tenho um campo de pesquisa. No momento, ele pesquisa todas as chaves. Portanto, se alguém digitar “Windows”, ele fará uma pesquisa com AJAX para todas as configurações: “W”, “Wi”, “Win”, “Wind”, “Windo”, “Window”, “Windows”.
Quero ter um atraso, por isso ele só procura quando o usuário para de digitar por 200 ms.
Não há opção para isso na keyup
função, e eu tentei setTimeout
, mas não funcionou.
Como eu posso fazer isso?
javascript
jquery
ajsie
fonte
fonte
Respostas:
Uso essa pequena função para o mesmo objetivo, executando uma função após o usuário parar de digitar por um período especificado ou em eventos que são disparados a uma taxa alta, como
resize
:Como funciona:
A
delay
função retornará uma função empacotada que manipula internamente um cronômetro individual; em cada execução, o cronômetro é reiniciado com o atraso de tempo fornecido; se várias execuções ocorrerem antes desse tempo passar, o cronômetro será redefinido e reiniciado.Quando o timer finalmente termina, a função de retorno de chamada é executada, passando o contexto e os argumentos originais (neste exemplo, o objeto de evento do jQuery e o elemento DOM como
this
).ATUALIZAÇÃO 16-05-2019
Reimplementei a função usando os recursos ES5 e ES6 para ambientes modernos:
A implementação é coberta com um conjunto de testes .
Para algo mais sofisticado, dê uma olhada no plugin jQuery Typewatch .
fonte
Se você deseja pesquisar após o término do tipo, use uma variável global para reter o tempo limite retornado da sua
setTimout
chamada e cancele-o com umclearTimeout
se ainda não tiver ocorrido, para que não ative o tempo limite, exceto no últimokeyup
eventoOu com uma função anônima:
fonte
Outro ligeiro aprimoramento na resposta do CMS. Para permitir atrasos separados facilmente, você pode usar o seguinte:
Se você deseja reutilizar o mesmo atraso, basta
Se você quiser atrasos separados, poderá fazer
fonte
someApiCall
ainda dispara várias vezes - agora apenas com o valor final do campo de entrada.Você também pode olhar no underscore.js , que fornece métodos utilitários como o debounce :
fonte
Com base na resposta do CMS, fiz o seguinte:
Coloque o código abaixo depois de incluir o jQuery:
E simplesmente use assim:
Cuidado: a variável $ (this) na função passada como parâmetro não corresponde à entrada
fonte
Atraso em chamadas multifuncionais usando etiquetas
Esta é a solução com a qual trabalho. Isso atrasará a execução em QUALQUER função que você desejar . Pode ser a consulta de pesquisa de teclas pressionadas, talvez o clique rápido nos botões anterior ou próximo (que de outra forma enviariam várias solicitações se clicassem rapidamente continuamente e não fossem utilizados, afinal). Isso usa um objeto global que armazena cada tempo de execução e o compara com a solicitação mais atual.
Portanto, o resultado é que apenas o último clique / ação será chamado, porque essas solicitações são armazenadas em uma fila, que após o milissegundo X é chamado, se não houver outra solicitação com o mesmo rótulo na fila!
Você pode definir o seu próprio tempo de atraso (opcional, o padrão é 500ms). E envie os argumentos da sua função de uma "maneira de fechamento".
Por exemplo, se você deseja chamar a função abaixo:
Para impedir várias solicitações send_ajax, você as adia usando:
delay_method( "check date", function(){ send_ajax(2); } ,600);
Qualquer solicitação que use o rótulo "data de verificação" será acionada apenas se nenhuma outra solicitação for feita no período de 600 milissegundos. Este argumento é opcional
Independência de rótulo (chamando a mesma função de destino), mas execute os dois:
Resulta em chamar a mesma função, mas atrasa-as de forma independente, porque seus rótulos são diferentes
fonte
Se alguém gostar de atrasar a mesma função, e sem variável externa, poderá usar o próximo script:
fonte
Abordagem super simples, projetada para executar uma função depois que um usuário terminar de digitar em um campo de texto ...
fonte
Esta função estende a função da resposta de Gaten um pouco para recuperar o elemento:
http://jsfiddle.net/Us9bu/2/
fonte
Estou surpreso que ninguém mencione o problema com várias entradas no snippet muito bom do CMS.
Basicamente, você teria que definir a variável de atraso individualmente para cada entrada. Caso contrário, se sb colocar texto na primeira entrada e pular rapidamente para outra entrada e começar a digitar, o retorno de chamada da primeira NÃO será chamado!
Veja o código abaixo com base em outras respostas:
Esta solução mantém a referência setTimeout na variável delayTimer da entrada. Ele também passa a referência do elemento ao retorno de chamada, como fazzyx sugerido.
Testado no IE6, 8 (comp - 7), 8 e Opera 12.11.
fonte
Isso funcionou para mim, onde atraso a operação da lógica de pesquisa e faço uma verificação se o valor é o mesmo que o inserido no campo de texto. Se o valor for o mesmo, seguirei em frente e realizo a operação para os dados relacionados ao valor da pesquisa.
fonte
Atraso na função para acessar cada keyup. jQuery 1.7.1 ou superior necessário
Uso:
$('#searchBox').keyupDelay( cb );
fonte
Esta é uma solução semelhante à do CMS, mas resolve alguns problemas importantes para mim:
Uso:
O código está escrito no estilo que eu gosto, talvez você precise adicionar vários pontos e vírgulas.
Coisas para manter em mente:
this
funciona conforme o esperado (como no exemplo).setTimeout
.A solução que eu uso adiciona outro nível de complexidade, permitindo que você cancele a execução, por exemplo, mas essa é uma boa base para desenvolver.
fonte
A combinação da resposta CMS com a de Miguel produz uma solução robusta que permite atrasos simultâneos.
Quando você precisar adiar ações diferentes independentemente, use o terceiro argumento.
fonte
Com base na resposta do CMS, aqui está um novo método de atraso que preserva "isso" em seu uso:
Uso:
fonte
Usar
onde expressão é o script a ser executado e tempo limite é o tempo de espera em milissegundos antes de ser executado - isso NÃO assombra o script, mas simplesmente atrasa a execução dessa parte até que o tempo limite seja concluído.
redefinirá / limpará o tempo limite para que ele não execute o script na expressão (como um cancelamento) desde que ainda não tenha sido executado.
fonte
Com base na resposta do CMS, ele simplesmente ignora os principais eventos que não mudam de valor.
fonte
Use o plugin jQuery bindWithDelay :
fonte
fonte
Aqui está uma sugestão que escrevi que cuida de várias entradas em seu formulário.
Esta função obtém o objeto do campo de entrada, insira seu código
Esta é a função delayCall real, cuida de vários campos de entrada
Uso:
fonte
No ES6 , também é possível usar a sintaxe da função de seta .
Neste exemplo, o código atrasa o
keyup
evento por 400 ms depois que os usuários terminam de digitar antes de chamarsearchFunc
fazer uma solicitação de consulta.fonte
jQuery :
Javascript puro:
fonte
Dê uma olhada no plug-in de preenchimento automático . Eu sei que ele permite que você especifique um atraso ou um número mínimo de caracteres. Mesmo que você não use o plug-in, analisar o código fornecerá algumas idéias sobre como implementá-lo.
fonte
Bem, eu também fiz um código para limitar a solicitação de ajax de alta frequência causada por Keyup / Keydown. Veja isso:
https://github.com/raincious/jQueue
Faça sua consulta assim:
E evento bind como este:
fonte
Vi isso hoje um pouco tarde, mas só quero colocar isso aqui, caso alguém precise. basta separar a função para torná-la reutilizável. o código abaixo esperará 1/2 segundo após a digitação de parada.
fonte
Usuário biblioteca javascript lodash e use a função _.debounce
fonte
fonte