直接することはできません。Javascriptはマルチスレッドではないため、関数は実行され、完了するまでキーの押下をブロックします。
ユーザーエクスペリエンスの観点からこれを許容できるようにする方法は、キーイベントですぐに関数をトリガーするのではなく、短時間待機してからイベントを発生させることです。
ユーザーが入力している間、タイムアウト関数は継続的に設定およびリセットされるため、gosearch関数は呼び出されないため、ユーザーは入力を中断することはありません。
ユーザーが入力を一時停止すると、タイムアウトはゼロまでカウントダウンし、検索関数を呼び出します。検索関数は実行され、入力が完了するまで入力をブロックします。ただし、ユーザーが現在入力を試みていない可能性があるため、(1秒程度で完了する限り)問題ありません。
また、gosearch関数をチャンクに分割して、実際に要求したことを実行することもできます。ここで、関数を呼び出すたびに、次のようになります。*これまでに処理された行数のカウンターを読み取り、さらに500行を処理してカウンターをインクリメントします。*時間の値がゼロのsetTimeoutを使用して別のgosearchを呼び出します。これにより、他の「スレッド」にイベントが生成され、検索語をすばやく変更できます。
var goSearchTimeout = null;
var linesSearched = 0;
function keySearch(e){
if(goSearchTimeout != null){
clearTimeout(goSearchTimeout);
linesSearched = 0;
}
goSearchTimeout = setTimeout(goSearch, 500);
}
$("#search").keyup(keySearch);
function highLight(index, element) {
if(index >= linesSearched){
var row = "#row-" + element.id.substr(5);
if ($(element).text().toLowerCase().indexOf(searchString,0) != -1){
$(row).show();
else{
$(row).hide();
}
if(index > linesSearched + 500){
linesSearched = index;
goSearchTimeout = setTimeout(goSearch);
return;
}
}
function goSearch(){
goSearchTimeout = null;
var searchString = $("#search").val().toLowerCase();
$(".lplist").each(highLight);
}
このようなタイムアウトコールバックを使用する場合は、コードをjQueryウィジェットにラップして、グローバル変数としてフロートさせるのではなく、オブジェクトの変数を使用して変数goSearchTimeoutなどを格納できるようにすることを強くお勧めします。