2010-06-12 5 views
37

Ich habe den folgenden Code, wie ich eine Datenbank durchsuchen möchte, wie ein Benutzer in ein Textfeld eingibt. Dieser Code unten funktioniert gut, aber es scheint ein wenig ineffizient, als ob ein Benutzer wirklich schnell tippen würde, ich mache möglicherweise mehr Suchen als nötig. Also, wenn ein Benutzer eingeben „Segel“optimierte Suche mit Ajax und Tastendruck

i auf „Segeln“ bin auf der Suche, „saili“, „sailin“ und „Segel“

Ich wollte sehen, ob es ein Weg war jeden zu erkennen bestimmte Zeit zwischen den Tasten drücken, so nur suchen, wenn der Benutzer für 500 Millisekunden oder so etwas zu stoppen stoppt.

Gibt es Best Practices für so etwas?

$('#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(); 
      }); 
     } 
    } 

Antwort

77

Sie können etwas tun:

$('#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(); 
    }); 
} 

dies Was tut, ist eine Suche durchführen (auf keyup, besser als keypress für diese Situationen) nach 500ms durch einen Timer auf dem #searchString des Elements Speicherung .data() collection . Alle keyup es löscht diesen Timer, und wenn der Schlüssel eingegeben wurde, sucht sofort, wenn es kein anderes 500ms Timeout vor der automatischen Suche festgelegt wurde.

+5

+1 Für Codebeispiel. – johnwards

+0

Wenn jemand Probleme mit diesem Code konfrontiert, überprüfen Sie dies: http://StackOverflow.com/a/1171758/849829 –

+0

genial! toller Code! Danke! – anand