2012-07-27 23 views
24

私はJQuery UIオートコンプリートを使用しています。すべてが期待どおりに機能しますが、キーボードの上/下キーを使用して循環すると、テキストボックスはリスト内の項目で予期されているように表示されますが、リストの終わりに達してもう一度下矢印を押すと私が入力した元の用語が表示されます。これは基本的にユーザがそのエントリを提出できるようにします。JQueryオートコンプリート:リストから選択を強制する方法(キーボード)

質問:リスト内の項目に選択範囲を限定し、キーボード選択から入力内のテキストを削除する簡単な方法はありますか?

例:{'Apples (AA)', 'Oranges (AAA)', 'Carrots (A)'}を含むリストがある場合、ユーザーが「app」と入力すると、リストの最初の項目(ここでは「Apples(AA)」)が自動的に選択されますが、矢印、 'app'が再度テキストボックスに表示されます。どうすればそれを防ぐことができますか?

ありがとうございました。フォーカスイベントで

+0

毎回のKeyDownイベントを添付変数

var inFocus = false; 

定義イベント。 1つの要素だけが存在するかどうかをチェックし、項目に 'click'イベントを発します。または、項目を選択します。 – Imdad

+0

常に最初の項目を選択していますが、キーボードを使用してリストを循環すると、私がリストの終わりに達したとき。それが私が防止しようとしていることです。基本的に、私はそれをリストの先頭に戻したい。 –

+1

'focus:function(event、ui){ falseを返します。 } ' – Imdad

答えて

3

"Before focus is moved to an item (not selecting), ui.item refers to the focused item. The default action of focus is to replace the text field's value with the value of the focused item, though only if the focus event was triggered by a keyboard interaction. Canceling this event prevents the value from being updated, but does not prevent the menu item from being focused."

reference


focus: function(e, ui) { 
    return false; 
} 
+0

ありがとうございます。これにより、キーボードのナビゲーションが問題を完全に回避するテキストボックスに入力されなくなります。 –

+0

@AliB歓迎です:) –

+0

これを差し込むと、問題の一部が解決されます。矢印キーでスクロールするときにテキストボックスが塗りつぶされなくなりましたが、まだテキストを返すことができます下のキーにはリストからフォーカスを外す「余分な」スロットがあるため、テキストボックスに表示されます。私はそれだけでリストにとどまることが必要です。何か案は? –

36

力の選択のため、あなたはオートコンプリート

"change" event
 var availableTags = [ 
      "ActionScript", 
      "AppleScript" 
     ]; 
     $("#tags").autocomplete({ 
      source: availableTags, 
      change: function (event, ui) { 
       if(!ui.item){ 
        //http://api.jqueryui.com/autocomplete/#event-change - 
        // The item selected from the menu, if any. Otherwise the property is null 
        //so clear the item for force selection 
        $("#tags").val(""); 
       } 

      } 

     }); 
+0

がうまく機能する – thepk

+2

このソリューションの問題は、誰かがフィールドに不正な値を入力してから入力すると、フォームが不正な値で送信されるということです。まだエレガントなソリューションを見つけようとしています。 – gitb

+0

可能な解決策は、フォームから 'type =" submit "を削除し、jQueryを使用してsubmitボタンのclickイベントを処理することです。結局、サーバー側の検証だけが本当に信頼できるものです。 – Sky

9

櫛これらのその他の回答の両方を使用することができますinationはうまくいく。

また、event.targetを使用してテキストをクリアすることもできます。これは、複数のコントロールに自動補完を追加する場合や、セレクターを2回入力したくない場合(保守性の問題がある場合)に役立ちます。

$(".category").autocomplete({ 
    source: availableTags, 
    change: function (event, ui) { 
     if(!ui.item){ 
      $(event.target).val(""); 
     } 
    }, 
    focus: function (event, ui) { 
     return false; 
    } 
}); 

「フォーカス」はfalseを返していても、アップ/ダウンキーがまだ値を選択すること、しかし、注意すべきです。このイベントをキャンセルすると、テキストの置換がキャンセルされます。したがって、 "j"、 "down"、 "tab"は "j"と一致する最初の項目を選択します。それはコントロールに表示されません。

+0

うまくいった。どうも! – ajbraus

+0

これは主に動作します。私はajaxソースを使用しています。オプションがロードされる前にユーザーがタブを押すと、変更によって結果がクリアされません。 – danielson317

2

ご入力

.on('focus', function() { 
    inFocus = true; 
}) 
.on('blur', function() { 
    inFocus = false; 
}) 

に以下のイベントを追加します。そして、それは発射するウィンドウにリストがロードされている

$(window) 
    .keydown(function(e){ 
     if(e.keyCode == 13 && inFocus) { 
      e.preventDefault(); 
     } 
    }); 
関連する問題