jQuery のオートコンプリート ウィジェットを機能させるのに苦労しています。サーバーからのキーと値のペアのリストを使用しています。
次の要件があります。
ユーザーがウィジェットから値を選択した場合、ID をサーバーに渡したいと思います。
ユーザーが値を選択せずに生のテキストを入力するか、既に選択されている値を変更した場合、ID フィールドをクリアして生のテキストだけをサーバーに送信する必要があります。
someAjaxFunction
オートコンプリート ウィジェットが期待するオブジェクトの配列を返すと仮定します: {label:label, value:key}
.
最初に、オートコンプリート ウィジェットを次のように設定しました。
$(input).autocomplete({
source: sourceFunction,
minLength: 1
});
アイテムの 1 つにカーソルを合わせて選択を変更すると、$(input) によって参照されるテキスト ボックス内のテキストが、ラベルではなく、基になるキーに変更されます。これは、ユーザー インタラクションの観点からは非常に望ましくありません。実際、私がこれを調査している理由は、私が構築しているサイトのユーザーが、入力したテキストが乱数に変わっているように見えることに一貫して困惑していたためです。
テキスト ボックスの下に隠しフィールドを追加し、次のように ID をクロークするために select() および focus() イベントを実装しました。
$(input).autocomplete({
source: sourceFunction,
minLength: 1
focus: function(event, ui) {
$(idField).val(ui.item.value);
$(this).val(ui.item.label);
return false;
},
select: function(event, ui) {
$(idField).val(ui.item.value);
$(this).val(ui.item.label);
return false;
},
minLength: 1
});
これは、ユーザーがオートコンプリート ドロップダウンによって提供されるスクリプトに固執している場合にうまく機能します。ID はクロークされ、サーバーに正しく送信されます。残念ながら、ユーザーがボックスに自由形式のテキストを入力し、その値に基づいて検索したい場合、ID フィールドはリセットされず、以前に選択した ID がサーバーに送信されます。これもかなり紛らわしいです。
jQuery UI Autocomplete のドキュメントには、change
イベントが一覧表示され、引数のitem
プロパティが選択された項目に設定されると記載されています。ui
キーを押すと非表示の ID フィールドをリセットし、オートコンプリートが変更された場合に ID を再入力できると考えました。残念ながら、 ID をリセットしてはならない一連のキー押下をキャプチャする keypress イベントに加えて、テキスト ボックス内のテキストを管理するために必要なreturn false
上記のイベントのステートメントにより、イベントに ui.item が適切に割り当てられません。select
change
だから今、私は立ち往生しています-ウィジェットがデフォルトでサポートする必要があると思われる機能をサポートするために他に何を試みることができるか本当にわかりません。このプロセスが本来よりもはるかに複雑であるか、本当に明白な何かが欠けています。利用可能なすべてのイベントとすべての例を選択しましたが、手ぶらで出てきました。実際、jQuery UI ページの「カスタム データと表示」の例でさえ、この問題に悩まされています。
これをカバーするためにサーバー側でいくつかのハックを追加できますが、クライアントレベルでこれを実行できることを本当に望んでいます.
また、別のウィジェットに切り替えるよりも、jQuery UI オートコンプリート ウィジェットに固執したいと思います。