J'ai un champ de recherche. En ce moment, il recherche chaque touche. Donc, si quelqu'un tape «Windows», il effectuera une recherche avec AJAX pour chaque touche: «W», «Wi», «Win», «Wind», «Windo», «Window», «Windows».
Je veux avoir un délai, donc il ne recherche que lorsque l'utilisateur arrête de taper pendant 200 ms.
Il n'y a pas d'option pour cela dans la keyup
fonction, et j'ai essayé setTimeout
, mais cela n'a pas fonctionné.
Comment puis je faire ça?
javascript
jquery
ajsie
la source
la source
Réponses:
J'utilise cette petite fonction dans le même but, en exécutant une fonction après que l'utilisateur a arrêté de taper pendant une durée spécifiée ou lors d'événements qui se déclenchent à un rythme élevé, comme
resize
:Comment ça fonctionne:
La
delay
fonction renverra une fonction encapsulée qui gère en interne un minuteur individuel, à chaque exécution le minuteur est redémarré avec le délai prévu, si plusieurs exécutions se produisent avant ce temps, le minuteur se réinitialise et recommence.Lorsque le temporisateur se termine enfin, la fonction de rappel est exécutée, en passant le contexte et les arguments d'origine (dans cet exemple, l'objet événement jQuery et l'élément DOM as
this
).MISE À JOUR 2019-05-16
J'ai ré-implémenté la fonction en utilisant les fonctionnalités ES5 et ES6 pour les environnements modernes:
L'implémentation est couverte par un ensemble de tests .
Pour quelque chose de plus sophistiqué, jetez un œil au plugin jQuery Typewatch .
la source
Si vous souhaitez rechercher une fois le type terminé, utilisez une variable globale pour maintenir le délai d'expiration renvoyé par votre
setTimout
appel et annulez-le avec unclearTimeout
s'il ne s'est pas encore produit afin qu'il ne déclenche le délai d'expiration que lors du dernierkeyup
événement.Ou avec une fonction anonyme:
la source
Une autre légère amélioration de la réponse de CMS. Pour permettre facilement des retards distincts, vous pouvez utiliser les éléments suivants:
Si vous souhaitez réutiliser le même délai, faites simplement
Si vous voulez des délais séparés, vous pouvez le faire
la source
someApiCall
se déclenche toujours plusieurs fois - maintenant juste avec la valeur finale du champ de saisie.Vous pouvez également regarder underscore.js , qui fournit des méthodes utilitaires comme debounce :
la source
Sur la base de la réponse de CMS, j'ai fait ceci:
Mettez le code ci-dessous après inclure jQuery:
Et utilisez simplement comme ceci:
Attention: la variable $ (this) dans la fonction passée en paramètre ne correspond pas à l'entrée
la source
Retarder les appels multifonctions à l'aide d'étiquettes
C'est la solution avec laquelle je travaille. Cela retardera l'exécution sur TOUTE fonction que vous souhaitez . Il peut s'agir de la requête de recherche par enfoncement, peut-être du clic rapide sur les boutons précédent ou suivant (qui autrement enverrait plusieurs demandes si on cliquait rapidement en continu et ne serait pas utilisé après tout). Celui-ci utilise un objet global qui stocke chaque heure d'exécution et le compare à la demande la plus récente.
Le résultat est donc que seul ce dernier clic / action sera réellement appelé, car ces demandes sont stockées dans une file d'attente, qu'après les X millisecondes est appelée si aucune autre demande avec le même label n'existe dans la file d'attente!
Vous pouvez définir votre propre temps de retard (optionnel, 500 ms par défaut). Et envoyez vos arguments de fonction de façon "fermée".
Par exemple, si vous souhaitez appeler la fonction ci-dessous:
Pour empêcher plusieurs demandes send_ajax, vous les retardez en utilisant:
delay_method( "check date", function(){ send_ajax(2); } ,600);
Chaque demande qui utilise le libellé "date de vérification" ne sera déclenchée que si aucune autre demande n'est effectuée dans le délai de 600 millisecondes. Cet argument est facultatif
Indépendance des étiquettes (appelant la même fonction cible) mais exécutez les deux:
Entraîne l'appel de la même fonction mais les retarde indépendamment car leurs étiquettes sont différentes
la source
Si quelqu'un aime retarder la même fonction, et sans variable externe, il peut utiliser le script suivant:
la source
Approche super simple, conçue pour exécuter une fonction après qu'un utilisateur a fini de taper dans un champ de texte ...
la source
Cette fonction étend un peu la fonction de la réponse de Gaten afin de récupérer l'élément:
http://jsfiddle.net/Us9bu/2/
la source
Je suis surpris que personne ne mentionne le problème des entrées multiples dans le CMS très bien coupé.
Fondamentalement, vous devez définir une variable de retard individuellement pour chaque entrée. Sinon, si sb met du texte à la première entrée et passe rapidement à une autre entrée et commence à taper, le rappel de la première NE SERA PAS appelé!
Voir le code ci-dessous que je suis venu avec basé sur d'autres réponses:
Cette solution conserve la référence setTimeout dans la variable delayTimer de l'entrée. Il transmet également la référence de l'élément au rappel comme suggéré par fazzyx.
Testé dans IE6, 8 (comp - 7), 8 et Opera 12.11.
la source
Cela a fonctionné pour moi où je retarde l'opération de logique de recherche et vérifie si la valeur est la même que celle entrée dans le champ de texte. Si la valeur est la même, je continue et j'exécute l'opération pour les données liées à la valeur de recherche.
la source
Fonction de délai pour appeler à chaque touche. jQuery 1.7.1 ou supérieur requis
Usage:
$('#searchBox').keyupDelay( cb );
la source
Il s'agit d'une solution similaire à celle des CMS, mais elle résout quelques problèmes clés pour moi:
Usage:
Le code est écrit dans un style que j'apprécie, vous devrez peut-être ajouter un tas de points-virgules.
À retenir:
this
fonctionne donc comme prévu (comme dans l'exemple).setTimeout
.La solution que j'utilise ajoute un autre niveau de complexité, vous permettant d'annuler l'exécution, par exemple, mais c'est une bonne base sur laquelle s'appuyer.
la source
La combinaison de la réponse CMS avec celle de Miguel donne une solution robuste permettant des retards simultanés.
Lorsque vous devez retarder différentes actions indépendamment, utilisez le troisième argument.
la source
S'appuyant sur la réponse de CMS, voici une nouvelle méthode de retard qui préserve «ceci» dans son utilisation:
Usage:
la source
Utilisation
où expression est le script à exécuter et timeout est le temps d'attente en millisecondes avant qu'il s'exécute - cela ne fait pas obstacle au script, mais retarde simplement l'exécution de cette partie jusqu'à ce que le timeout soit terminé.
réinitialisera / effacera le délai afin qu'il n'exécute pas le script dans l'expression (comme une annulation) tant qu'il n'a pas encore été exécuté.
la source
Basé sur la réponse du CMS, il ignore simplement les événements clés qui ne changent pas de valeur.
la source
Utilisez le plugin bindWithDelay jQuery:
la source
la source
Voici une suggestion que j'ai écrite qui prend en charge les entrées multiples dans votre formulaire.
Cette fonction récupère l'objet du champ de saisie, inséré dans votre code
Ceci est la fonction delayCall réelle, prend en charge plusieurs champs d'entrée
Usage:
la source
Depuis ES6 , on peut également utiliser la syntaxe de la fonction flèche .
Dans cet exemple, le code retarde l'
keyup
événement pendant 400 ms une fois que les utilisateurs ont fini de taper avant d'appeler,searchFunc
effectuez une requête.la source
jQuery :
Javascript pur:
la source
Jetez un œil au plugin de saisie semi - automatique . Je sais que cela vous permet de spécifier un délai ou un nombre minimum de caractères. Même si vous ne finissez pas par utiliser le plugin, parcourir le code vous donnera quelques idées sur la façon de l'implémenter vous-même.
la source
Eh bien, j'ai également créé un morceau de code pour la cause de la demande d'ajax haute fréquence limite par Keyup / Keydown. Regarde ça:
https://github.com/raincious/jQueue
Faites votre requête comme ceci:
Et liez un événement comme celui-ci:
la source
J'ai vu cela un peu tard aujourd'hui, mais je veux juste le mettre ici au cas où quelqu'un d'autre aurait besoin. séparez simplement la fonction pour la rendre réutilisable. le code ci-dessous attendra 1/2 seconde après avoir tapé stop.
la source
Bibliothèque utilisateur javascript lodash et utilisation de la fonction _.debounce
la source
la source