La réponse choisie ci-dessus ne fonctionne pas.
Parce que typingTimer est parfois activé plusieurs fois (touche pressée deux fois avant que touche pressée ne soit déclenchée pour les dactylographes rapides, etc.), il ne s'efface pas correctement.
La solution ci-dessous résout ce problème et appelle X secondes après la fin de l'opération, comme demandé par le PO. Elle ne nécessite plus non plus la fonction redondante keydown. J'ai également ajouté une vérification pour que l'appel de la fonction ne se produise pas si votre entrée est vide.
//setup before functions
var typingTimer; //timer identifier
var doneTypingInterval = 5000; //time in ms (5 seconds)
//on keyup, start the countdown
$('#myInput').keyup(function(){
clearTimeout(typingTimer);
if ($('#myInput').val()) {
typingTimer = setTimeout(doneTyping, doneTypingInterval);
}
});
//user is "finished typing," do something
function doneTyping () {
//do something
}
Et le même code dans la solution vanilla JavaScript :
//setup before functions
let typingTimer; //timer identifier
let doneTypingInterval = 5000; //time in ms (5 seconds)
let myInput = document.getElementById('myInput');
//on keyup, start the countdown
myInput.addEventListener('keyup', () => {
clearTimeout(typingTimer);
if (myInput.value) {
typingTimer = setTimeout(doneTyping, doneTypingInterval);
}
});
//user is "finished typing," do something
function doneTyping () {
//do something
}
Cette solution utilise ES6 mais ce n'est pas nécessaire ici. Il suffit de remplacer let
avec var
et la fonction flèche avec une fonction régulière.
27 votes
Je pense que vous allez devoir définir "finir de taper" pour nous.
8 votes
Bien que la réponse de @Surreal Dreams satisfasse la plupart de vos exigences, si l'utilisateur recommence à taper APRÈS le délai spécifié, de multiples requêtes seront envoyées au serveur. Voir ma réponse ci-dessous qui stocke chaque requête XHR dans une variable et l'annule avant d'en envoyer une nouvelle. C'est en fait ce que fait Google dans son Instantané recherche.
0 votes
La réponse choisie est incorrecte pour plusieurs raisons : 1. Il se déclenche toujours après 5 secondes, même si l'utilisateur est en train de taper. 2. Il n'attend pas que l'utilisateur ait fini de taper comme demandé. 3. Il lance des requêtes multiples comme mentionné par @Marko ci-dessus. Voir ma réponse corrigée ci-dessous.
1 votes
Qu'en est-il du flou ? Je suppose que l'utilisateur a définitivement fini de taper lorsque l'élément de saisie perd le focus.
11 votes
Une simple recherche sur Google aurait pu vous donner la réponse : schier.co/blog/2014/12/08/…