2011-10-31 2 views

答えて

8

私はあなたがリモートデータソースを使用していると仮定しています。その場合は、sourceパラメータに指定した関数の中で$.ajaxを使用してください。例えば:

$("#auto").autocomplete({ 
    source: function(request, response) { 
     $("#loading").show(); // Where #loading is the loading indicator 

     $.ajax({ 
      url: "Your_URL_HERE", 
      data: request.term, 
      success: function(data) { 
       response(data); 
       $("#loading").hide(); 
      }, 
      error: function() { 
       $("#loading").hide(); 
      } 
     }); 
    } 
}); 

実施例:http://jsfiddle.net/gKFJU/

+0

私はこれを試してみましたが、メニューが更新される前に、時には隠され得る負荷要素を発見しました。私はajax 'complete'イベントでそれを隠そうとしましたが、改善はしませんでした。私が行った唯一のことは、 'open'と' close'オートコンプリートイベントの両方でそれを隠すことです。なぜこれが事実だろうか?この動作は、ajaxが完了した後にメニューが更新されるのが遅れることがあることを示しているようです。 – billynoah

+0

@billynoahこれは競合状態のためです。たとえば、term = "foo"のXHRを起動し、term = "foobar"の別のXHRを起動する "bar"というタイプのユーザー "foo"を入力します。 "foo"要求が最初に完了したとします。これはローディングアイコンを隠すことを意味します。しかし、オートコンプリートはメニューを表示するために "foobar"リクエストが完了するのを待つので、メニューは表示されません。このプラグインはバックグラウンドで競合状態を処理し、順不同のAJAX要求をインテリジェントに処理することに注意してください。 –

+0

よろしくお願いいたします。その場合、 'open'イベントと' close'イベントを使用する方が、プラグインが現在のすべてのリクエストを完了したときにのみローディング要素を削除する方が良いでしょう。同意しますか?あなたはこれを処理するためのより良い方法を考えることができますか? – billynoah

4

CSSソリューション

ローディング・エレメントは、入力制御の兄弟である場合、CSS一般兄弟セレクタを使用することができる。

.loading { 
    /* whatever */ 
} 
#autocomplete.ui-autocomplete-loading ~ .loading { 
    background-image: url(loading.gif); 
} 

Working example

jQueryのソリューション

あなたはsearchresponseイベントハンドラを追加することができます。このアプローチは、以来、競合状態に苦しんでいることを

$("#autocomplete").autocomplete({ 
    delay: 500, 
    minLength: 3, 
    source: "/search.json", 
    search: function() { 
     $("#loading2").show(); 
    }, 
    response: function() { 
     $("#loading2").hide(); 
    } 
}); 

ノートは、(i)AJAX要求は必ずしも(ⅱ)オートコンプリートが検索よりも少ない応答イベントを発生ことがあり、彼らが開始されたために終了しません。

Combined demo here

関連する問題