0

これが私のコードです:

$("#hifind-find").keyup(function(){

  var val = $(this).val();

  if (val.length > 1) {
    var posturl = '/hifind/jquery_ui/autocomplete/'+val;

    $.post(posturl, function(r) { 

      $("#hifind-find").autocomplete({
        source: r,
        delay: 50,
        minLength: 2
      });

      $("#hifind-find").bind('autocompleteselect', function(){
        alert('test');
      });

    }, "json");
  }

});

#hifind-find フィールドに文字を入力します。予想どおり、val がまだ 1 より大きくないため、何も起こりません。2 番目の文字を入力します。予想どおり、投稿が発生し、firebug での応答は私が期待するものです。しかし、jquery ui プラグインは、フィールドの下に一致するアイテムを表示しません。次に、バックスペースを 1 回押してから 2 番目の文字をもう一度入力すると、投稿が再び起動し、今度はオプションが表示されます。同一の検索が2回連続して実行されると、常に結果が表示されます。そう...

  1. ba (オプションは表示されません)
  2. バックスペースを 2 回実行してから...
  3. ba (「バナナ」はオプションとして表示され、「ベーブ ルース」など)。

しかし、リロードすると...

  1. ba (何も表示されない)
  2. ap (何も表示されない)
  3. ba (何も表示されない)
  4. ap (同じ検索を 2 回連続して実行するまで、何も表示されません)

コールバックからの応答が毎回同じで、正しいデータが含まれていることを firebug で確認できます。

アイデア?

4

4 に答える 4

1

2回目のキーアップの後にのみ、コンポーネントをオートコンプリートに変えています。

これでは意味がありません。彼らのデモに従わないのはなぜですか? あなたが作っているよりずっと簡単です。

于 2012-06-01T23:12:58.403 に答える
1

あなたの問題は、keyup イベントが AJAX が戻ってコールバック関数を実行するのを待たないことです。キーアップ イベントは、オートコンプリート ソースにデータが含まれる前に完了します。2 度目に実行すると、ソースは以前の AJAX 呼び出しから既に取り込まれているため、(一種の) 動作します。

于 2012-06-01T23:19:04.913 に答える
1

あなたはそれをすべて間違っています。自分で keyup にバインドする代わりに、オートコンプリート検索フィールドにコールバックを提供する必要があります。

この投稿を参照してください: http://jqueryui.com/demos/autocomplete/#remote-with-cache

オートコンプリートをより適切に使用する方法について。

あなたの例では、次のようになります。

      $("#hifind-find").autocomplete({
        source: function(request, response) {
          var posturl = '/hifind/jquery_ui/autocomplete/'+request.term;
          $.post(posturl, function(data) { 
             response(data);
          }, "json");
         },
        delay: 50,
        minLength: 2
      });

      $("#hifind-find").bind('autocompleteselect', function(){
        alert('test');
      });

リンク先の投稿で説明されているように、それにキャッシュを追加することをお勧めします。

于 2012-06-01T23:21:43.973 に答える
0

これは、最初に入力する必要があるためだと思います。その後、文字を取得する準備が整うので、最初に文字を取得したときに入力しようとしないのはなぜですか。準備ができている...

このコード:

val.length > 1

次のようにする必要があります。

val.length > 0

さらに、キーが押されるたびに投稿を呼び出すのは良い考えではないと思います。最初に投稿を取得して、オートコンプリートオブジェクトを埋めることができ、その後、そのオブジェクトを使用する必要があります...

于 2012-06-01T22:59:00.890 に答える