2012-02-22 20 views
1

私はphpとjqueryを使って検索ボックスを実装しようとしています(検索結果はデー​​タベースから来ています)。私がしたいのは、ユーザーが検索ボックスに入力すると、ユーザーが検索ボックスに入力したキーワードを含むデータを検索するためのクエリが作成されるということです。これを実行すると、問題はもちろん、ユーザーが入力して行われるたびに(、何の原因と呼ばれている)(関数retrieve_results、ということであるphp/jquery検索ボックス

:私がいる問題は、私はこのような何かを持っているということですキーアップがあります)。したがって、ユーザーが10文字のような単語を入力すると、retrieve_results()関数が10回連続して呼び出されるため、これは非常に遅くなる可能性があります。また、私はretrieve_results()関数の中で、結果を得るためにjQuery $ .ajaxを使ってAjaxリクエストを行っています。だから私の質問は、次のとおりです:

私はそれを行うようにするには、retrieve_results()は、ユーザーが入力を停止するたびに実行されないように(キーがアップ)。しかし、私はその機能を維持したい、私はユーザーが "検索"ボタンまたは何かをクリックしないようにしたい。私はちょうど私のretrieve_results()関数ユーザーがすべてのキーワードを入力することで行われたときに一度だけ呼び出さする(毎回ユーザーが手紙か何かに入っていない)

あなたはtimmerを開始することができ、あなたに

答えて

2

理想的には、ユーザーが入力した最後の文字に対してのみ検索を開始するのが理想的です。これを行う最善の方法は、彼に絶えず入力するのに十分な時間を与えることです。もし彼が一時停止(思考することさえ)したら、検索を実行します。 setTimeoutを単独で使用すると、それが複数回発生するため、動作しません。 clearTimeoutを使用してタイムアウトをクリアする必要があります。

$(document).ready(function() { 
    var timeout, 
     $search_box = $('#my_search_box'); 

    $search_box.keyup(function() { 
     if (timeout) { 
      clearTimeout(timeout); 
     } 

     timeout = setTimeout(function() { 
      search(); 
     }, 1000); 
    }); 

    function search() { 
     var search_txt = $search_box.val(); 
    } 
}); 

ここで何が起こっているのかです:: 私たちはあなたからkeyup機能の上に宣言されなければならない変数にsetTimeoutタイマーを割り当て、それぞれその変数をチェックし

あなたは所望の効果を達成するために、次の使用することができます時間はkeyupです。進行中の既存のsetTimeoutがある場合は、search()関数を起動しないようにクリアし、指定されたミリ秒数(この例では1000)を待機する新しいタイマーを作成します。

はデモについては、以下を参照してくださいJSFiddle:http://jsfiddle.net/highwayoflife/WE4Fr/

+0

ありがとう、あなたは男ですが、質問、毎回タイマーをクリアする必要があるのはなぜですか? – user765368

+0

@ user765368既存のタイムアウト機能が実行されている場合にのみタイムアウトをクリアします。このタイムアウトをクリアしなかった場合は、キーを押すたびに検索が実行され、1000ミリ秒だけ遅延します。試してみてください... jsfiddleで 'if(timeout)...'コードを削除してスクリプトを実行してください。 1秒後にすべてのキーを押すと検索機能がどのように起動するのか気づくでしょう。 –

1

ありがとうをしたいと思います。 ..let`sは言う...最初のキーの後に...間隔が2秒以上である場合(キーの間)、他の検索が http://api.jquery.com/delay/

To delay JavaScript function call using jQueryから)待ってください:

$("#button").bind("sample",function() { 
     sample(); 
    }); 

    $("#button").click(function(){ 
     $(this).delay(2000).trigger("sample"); 
    }); 

遅延

ALTERNATIVE(テスト) は3分それ `s後半(午前二時12分AM私現地時間)に行われ

$("#my_search_box").keyup(function(){ 
      setTimeout(search, 30000); 
}); 
function search(){ 
     alert('ok'); 
} 
+0

+1あなたが作業例を提供することができます。 :) –

+0

チャレンジ可 –

+0

私の関数がパラメータをとる場合、どうすればそれらのパラメータを自分のsetTimeout関数の中に渡すのですか? – user765368

0

でテストする時間がなかった私が推薦しますjQueryの遅延メソッドまたはJavaScriptのsetTimeout()関数を使用して、keyupメソッドが実行されるたびに間隔が元の間隔にリセットされます。 setTimeout()メソッドのHere is a brief explanation、およびその他のいくつかのタイマーメソッドがJavaScriptにあります。

0

このようにする必要があります。クエリを格納するグローバル変数を作成し、retrieve_resultsへの新しい呼び出しに十分な時間が経過したかどうかを知るための別の変数を作成します。すべてのキーアップでsearchQueryを更新しますが、必要な時間が経過した後にのみretrieve_resultsを実行します。それがあなたを助けることを願っています

searchQuery=""; 
    timeIsUp=true; 

    $("#my_search_box").keyup(function(){ 

     searchQuery=$(this).val(); 

     if(timeIsUp){ 
     timeIsUp=false; 
     setTimeOut("retrieve_results(searchQuery); timeIsUp=true",500); 
     } 

    }); 
+0

私はこれがunpoliteではないことを望む、私は最初の答えにコメントすることはできませんし、あなたはそれをより良くすることができると思います。最初の回答のように明確なタイムアウトを呼び出す必要はありません。別のものが実行されている場合は新しいsetTimeOutを作成せずに、変数にsearchQueryを格納して、最後の変更が常に探しています。多くのタイマーを作成して破壊するよりも効率的です。 –

+0

クリアタイムアウトを使用していないにもかかわらず、起動しなかった場合でも、ユーザーがまだ入力をしていなくても、検索は実行されます。だから、クエリが入力されるまでに5秒かかり、完了するまで待つのではなく、検索が10回(500ms)または1000ms待機で5回実行されます。 clearTimeoutを使用すると、ユーザーが1000msの入力を終えたときに検索が開始されます。これはサーバー上でより軽いです。 –

+0

本当に、申し訳ありません。それはサーバ上でより軽いでしょう、それは本当です。 –

関連する問題