オートコンプリートを拡張しようとしているので、アイテムが選択されたときにセカンダリ ラベルが表示されます。たとえば、プロジェクトを表示するオートコンプリートの場合、コードを含む入力ボックスの横にあるスパン タグにプロジェクト名が表示されます。
オートコンプリート ソース コードを見ると、フィルタリングされた値のドロップダウンが jQuery メニュー ウィジェットを使用してレンダリングされ、特定のキーがテキスト ボックスに入力されると、メニュー ウィジェットでさまざまな関数が呼び出されることがわかります。たとえば、Enter キーと Tab キーが押されると、メニュー ウィジェットの select() 関数が呼び出されます。
メニュー ウィジェットは、選択されたイベントが発生したときに、オートコンプリート ウィジェットが選択された項目を取得し、独自の選択イベントを発生させてから、項目の値をテキスト ボックスに表示するように構成されています。
したがって、次のコードを考えると
(function ($, undefined) {
$.widget('xyz.autocompletePlus', $.ui.autocomplete, {
options: {
selectedDescriptor: null
},
_create: function () {
$.ui.autocomplete.prototype._create.call(this, this.options);
if (!this.options.selectedDescriptor) {
$("<span class='ui-xyz-autocomplete-label'>").insertAfter(this.element).html('Nothing selected');
}
},
_setOption: function (name, value) {
$.ui.autocomplete.prototype._setOption.call(this, arguments);
},
destroy: function () {
$.ui.autocomplete.prototype.destroy.call(this);
$.Widget.prototype.destroy.call(this);
}
});
} (jQuery));
アイテムが選択されたときに呼び出されるコードにフックして、独自のロジックを挿入するにはどうすればよいですか? アイデアは、実行する代わりに
if ( false !== self._trigger( "select", event, { item: item } ) ) {
self.element.val( item.value );
}
私は(実際のコードではなく、要点を理解する)のようなものが欲しいです
if ( false !== self._trigger( "select", event, { item: item } ) ) {
self.element.val( item.value );
this.options.selectedDescriptor.html( item.description);
}
新しいウィジェットでオートコンプリートを継承せずにカプセル化する場合は、オートコンプリートの選択イベントにバインドして自分のことを行うことができますが、継承では困惑します。
編集:
置換またはフックする必要があるオートコンプリート ソースを追加しました。jquery-ui-1.8.22.js の 6137 行目から始まります
this.menu = $( "<ul></ul>" )
...
...
.menu({
focus: function( event, ui ) {
...
...
}
},
selected: function( event, ui ) {
var item = ui.item.data( "item.autocomplete" ),
previous = self.previous;
// only trigger when focus was lost (click on menu)
if ( self.element[0] !== doc.activeElement ) {
self.element.focus();
self.previous = previous;
// #6109 - IE triggers two focus events and the second
// is asynchronous, so we need to reset the previous
// term synchronously and asynchronously :-(
setTimeout(function() {
self.previous = previous;
self.selectedItem = item;
}, 1);
}
if ( false !== self._trigger( "select", event, { item: item } ) ) {
self.element.val( item.value );
}
// reset the term after the select event
// this allows custom select handling to work properly
self.term = self.element.val();
self.close( event );
self.selectedItem = item;
},
...
...
ありがとう。