2010-03-14 3 views
5

Je travaille à la création d'un plugin jQuery AutoSuggest, inspiré par les projecteurs d'Apple.AutoSuggest efficace avec jQuery?

Voici le code général:

$(document).ready(function() { 
$('#q').bind('keyup', function() { 

    if($(this).val().length == 0) { 
     // Hide the q-suggestions box 
     $('#q-suggestions').fadeOut(); 
    } else { 
     // Show the AJAX Spinner 
     $("#q").css("background-image","url(/images/ajax-loader.gif)"); 

     $.ajax({ 
      url: '/search/spotlight/', 
      data: {"q": $(this).val()}, 
      success: function(data) { 
       $('#q-suggestions').fadeIn(); // Show the q-suggestions box 
       $('#q-suggestions').html(data); // Fill the q-suggestions box 

       // Hide the AJAX Spinner 
       $("#q").css("background-image","url(/images/icon-search.gif)"); 

      } 
     }); 
    } 
}); 

La question que je veux résoudre bien & avec élégance, ne tue pas le sever. En ce moment, le code ci-dessus frappe le serveur chaque fois que vous tapez une clé et n'attend pas que vous ayez fini de taper. Quelle est la meilleure façon de résoudre cela? A. Tuer une requête AJAX précédente? B. Un type de mise en cache AJAX? C. Ajout d'un certain type de délai pour soumettre uniquement .AJAX() lorsque la personne a cessé de taper depuis 300ms environ?

+2

Avez-vous regardé le nouveau plugin autocomplete de jQuery UI http://jqueryui.com/demos/autocomplete/? – PetersenDidIt

+1

jQuery n'est pas un acronyme. – SLaks

+0

@nobosh: Je suis après avoir implémenté autosuggest efficace sans tuer le serveur et si vous êtes en mesure d'arriver avec quelque chose que vous pensez qu'il est efficace, vous partager le code du serveur d'exemple? - Merci. –

Répondre

9

Essayez d'utiliser Ben Alman's Throttle & Debounce plugin

vous permet de « retard » des choses jusqu'à ce que l'utilisateur se fait.

Pour un exemple sur la façon de l'utiliser, consultez son example of debouncing with a pretend autocomplete

Votre code serait essentiellement devenu

var qinput = $('#q').bind('keyup', $.debounce(250, function() { 

    if($(this).val().length == 0) { 
     // Hide the q-suggestions box 
     $('#q-suggestions').fadeOut(); 
    } else { 
     // Show the AJAX Spinner 
     qinput.addClass('loading'); 

     $.ajax({ 
      url: '/search/spotlight/', 
      data: {"q": $(this).val()}, 
      success: function(data) { 
       $('#q-suggestions') 
        .fadeIn() // Show the q-suggestions box 
        .html(data); // Fill the q-suggestions box 

       // Hide the AJAX Spinner 
       qinput.removeClass('loading').addClass('search'); 
      } 
     }); 
    } 
})); 

CSS

.loading{ 
    background: url('/images/ajax-loader.gif'); 
} 
.search{ 
    background: url('/images/icon-search.gif'); 
} 

Vous remarquerez que j'ai enlevé votre background-image css et les a remplacés par addClass/removeClass. Beaucoup plus facile de gérer les trucs css dans les fichiers CSS.

+0

Cela semble intéressant, mais c'est beaucoup de code pour ça, n'est-ce pas? – AnApprentice

+1

Ne pas appeler 0.7kb beaucoup de code http://github.com/cowboy/jquery-throttle-debounce/raw/v1.1/jquery.ba-throttle-debounce.min.js – PetersenDidIt

+0

True. Comment suggéreriez-vous de mettre en place Throttle sur le code ci-dessus? Je ne vois pas comment utiliser le plug-in à cet égard. thxs – AnApprentice

2

J'irais pour une variante de C. N'attendez pas que les utilisateurs arrêtent de taper, mais attendez un peu (200ms?) Après la première frappe. Ensuite, après ce temps, vous aurez dans de nombreux cas reçu des frappes supplémentaires et ensuite vous utiliserez les caractères tapés pour obtenir l'autosuggest. Si vous appuyez sur une autre touche après avoir envoyé la demande, vous recommencez à compter.

Et vous devriez certainement faire un peu de mise en cache aussi; les gens vont utiliser le retour arrière et vous devrez à nouveau afficher la liste des noms.

+0

Thxs, pouvez-vous offrir quelques conseils sur la façon de mettre en œuvre un Delay & Caching? – AnApprentice

+0

Vous pouvez regarder le plugin jQuery ici: http://code.google.com/p/jquery-autocomplete/ Il supporte des paramètres comme delay et cacheLength –

2

Je ne sais pas, ce que DB utilisez-vous ou êtes-vous en utilisant le fichier hardcoded !?

de toute façon un bon point de départ est d'attendre au moins un FdF NUMS de caractères pour

es .: après 3 (qui est un mot min longueur pour la recherche mysql dans la plupart des cas) carbonise alors vous pouvez commencer à chercher votre fichier DB ou JSON!

Je pense que vous devez donner à PHP ou d'autres le travail dur comme FILTRATION etc, etc .. avant de renvoyer le responce!

BTW, je pense que l'un des meilleurs AutoSuggest est celui de brandspankingnew

Questions connexes