2009-08-05 4 views
1

私はここにいるので、どうかしてください。これはやや紛らわしい状況です。 :)ユーザーからの数秒間使用していない状態で数秒後にajaxコードを実行する

ユーザーが検索テキストボックスに別のユーザー(または名前の一部)の名前を入力し、その検索文字列に一致するユーザーの一覧が返される検索入力に取り組んでいます。問題は、何万人ものユーザーが関わっているときには少し遅いということです。この遅さのために、ユーザーが検索入力に名前をすぐに入力すると、キーストロークごとに検索結果がフラッシュされます(ユーザーが既に検索文字列を入力した後)。それはひどく遅れた反応のようです。

たとえば、名前「Wendy」に入力すると、検索文字列「W」(入力した最初の文字)の検索結果はまだ表示されません。すでに「Wendy」の検索結果が表示されているにもかかわらず、「W」という文字の検索結果が表示され、「We」などが表示されます。

私がやりたいことは、ユーザーが一定の時間(何秒もの間)何も入力していないときだけ検索を実行することです。それ以外の場合は、「検索中」と表示されます。 Javascriptメソッドのコードは次のとおりです。メモと同様に、そのコードは現在ユーザーを検索するために機能していますが、遅延実行を実装するだけです。

function updateSearchResults() { 
    if($F('searchString').length > 0){ 
     Element.update($('searchResultsScrollBox'), '<h3>Searching...</h3>'); 
     $('searching').style.display = 'block'; 
     var url = '<c:url value='ajaxFrontGetUsers.html'/>'; 
     var ajax = new Ajax.Updater({success: 'searchResults'}, url, 
     {method: 'post', parameters: $('searchForm').serialize(true)}); 
     $('searching').style.display = 'none'; 
    } 
} 

私はこれがすべて意味をなさないことを願っています。助けることができる人のために事前に感謝します。

答えて

2

は、以下の手順を試してください:

  1. 数ミリ秒毎に、テキストボックスがそれに新たなデータを持っているかどうかを確認します。
  2. テキストボックスに新しいテキストがある場合は、Ajaxを実行し、テキストを変数にコピーします(手順1の比較のため)。

パフォーマンスを向上させたい場合は、ユーザーが何か入力するたびにタイマーをアクティブにし、Ajax呼び出しが行われたときにタイマーを無効にします。

0

お返事ありがとうございます。 JavaScriptの機能が500ミリ秒の時間内に新しい文字が検索文字列に入力されたかどうかを確認するために、500ミリ秒の間隔を設定しました。そうであれば、ユーザが入力した文字列を検索するために検索関数が呼び出されます。それ以外の場合は、ユーザーが入力を停止するまでさらに500ミリ秒待機します。結局、あなたが提案したものと非常に似ています。 もう一度おねがいします!

0

また、グローバル変数をクリアするアイテムに「onkeypress」イベントハンドラを設定したり、AJAXイベントが発生しないようにタイマーをキャンセルすることもできます。プロトタイプは、インプレースエディタと「頻度」オプションを使用して、これを実装しています。 (キーが押されるたびにキャンセルするタイムアウトタイマーを設定していると思います)。

0

これは古い質問ですが、他の人が見ていると分かりますが、これについて間違った方向に進むと思います。私は、日付/タイムスタンプ各AJAX呼び出し、およびJavaScriptのデータタイムスタンプを追跡する必要がありますと思う。次に、ajax呼び出しが返されると、日付/時刻スタンプをチェックし、最も再送信されたajax呼び出しの結果セットであることを確認できます。こうすることで、各キーストロークに対してajaxコールを直ちに行うことができますが、ajaxの結果がタイピングに追いついた場合にのみ結果を表示します。

また、一致するすべての結果を送信していますか?手紙Wのために何千ものように?おそらくあなたはデータベース上の結果をランク付けして、トップ10-20だけを返すべきでしょう。とにかく10-20を超える結果を見たいとは思わない。

さらに、SQLクエリは最適ですか?クエリに時間がかかりすぎるようです。検索のような片面検索(例:like input+'%')では、両面検索(つまり、like '%' + input + '%')ではなく、テーブルに置くことができる本当に良いインデックスがあります。

関連する問題