J'ai le code suivant que je souhaite utiliser pour rechercher une base de données lorsqu'un utilisateur tape dans une zone de texte. Le code ci-dessous fonctionne bien mais il semble un peu inefficace, comme si un utilisateur tapait très vite. Je fais potentiellement beaucoup plus de recherches que nécessaire. Donc, si un utilisateur tape "voile", je recherche "voile", "saili", "sailin" et "voile".
Je voulais voir s'il y avait un moyen de détecter un temps particulier entre les touches, donc ne recherchez que si l'utilisateur arrête de taper pendant 500 millisecondes ou quelque chose comme ça.
Existe-t-il une meilleure pratique pour quelque chose comme ça?
$('#searchString').keypress(function(e) {
if (e.keyCode == 13) {
var url = '/Tracker/Search/' + $("#searchString").val();
$.get(url, function(data) {
$('div#results').html(data);
$('#results').show();
});
}
else {
var existingString = $("#searchString").val();
if (existingString.length > 2) {
var url = '/Tracker/Search/' + existingString;
$.get(url, function(data) {
$('div#results').html(data);
$('#results').show();
});
}
}
Vous pouvez faire quelque chose comme ça:
$('#searchString').keyup(function(e) {
clearTimeout($.data(this, 'timer'));
if (e.keyCode == 13)
search(true);
else
$(this).data('timer', setTimeout(search, 500));
});
function search(force) {
var existingString = $("#searchString").val();
if (!force && existingString.length < 3) return; //wasn't enter, not > 2 char
$.get('/Tracker/Search/' + existingString, function(data) {
$('div#results').html(data);
$('#results').show();
});
}
Cela permet d'effectuer une recherche (sur keyup
, mieux que keypress
pour ces situations) après 500ms
En stockant un minuteur sur l'élément #searchString
- .data()
collection . Chaque keyup
efface ce temporisateur, et si la touche a été entrée, recherche immédiatement, si elle n'a pas défini un autre timeout 500ms
Avant la recherche automatique.
Voir cette ancienne question:
Ce que je ferais, c'est que chaque pression sur une touche utilise une fonction setTimeout avec le délai souhaité. Cette fonction se déclenchera donc après ce délai. Appuyez sur chaque touche, puis supprimez le minuteur et définissez-en un nouveau, avec clearTimeout ();
Voir ici pour quelques exemples, faisant défiler toutes les annonces.
http://www.elated.com/articles/javascript-timers-with-settimeout-and-setinterval/