这里有一个解决方案。它可能需要进行一些调整才能在同一页上使用多个自动完成,但它可以用于单个自动完成:
(function( $ ) {
$.extend($.ui.autocomplete.prototype, {
_createSelection: function($input, start, end) {
var field = $input.get(0);
if( field.createTextRange ){
var selRange = field.createTextRange();
selRange.collapse(true);
selRange.moveStart("character", start);
selRange.moveEnd("character", end);
selRange.select();
} else if( field.setSelectionRange ){
field.setSelectionRange(start, end);
} else {
if( field.selectionStart ){
field.selectionStart = start;
field.selectionEnd = end;
}
}
field.focus();
},
_autoFill: function($input, sValue) {
if (this._lastKeyPressCode != 8) {
$input.val($input.val() + sValue.substring(this._previousValue.length));
this._createSelection($input, this._previousValue.length, sValue.length);
}
},
_previousValue: '',
_lastKeyPressCode: null
});
$( ".ui-autocomplete-input" )
.live( "keyup", function() {
var $this = $(this),
autocomplete = $this.data('autocomplete'),
key;
autocomplete._lastKeyPressCode = key = event.which;
if( key == 46 || (key > 8 && key < 32) )
return autocomplete.menu.deactivate();
var v = $this.val();
if (v == autocomplete._previousValue)
return;
autocomplete._previousValue = v;
})
.live( "autocompleteopen", function() {
var $this = $(this),
autocomplete = $this.data( "autocomplete" ),
menu = autocomplete.menu;
if ( !autocomplete.options.selectFirst ) {
return;
}
menu.activate( $.Event({ type: "mouseenter" }), menu.element.children().first() );
autocomplete._autoFill($this, menu.element.children().first().text());
});
}( jQuery ));
$('.for-autocomplete').autocomplete({selectFirst: true, source: ['aa','absolution','borinage','baba']});
为了初始化自动完成小部件,您需要添加新选项
selectFirst: true/false
。
自动填充和创建选择方法来自于此
自动完成插件,而现场事件的绑定则受到此
帖子的启发。
祝好!
编辑
我已经修改了代码,现在它与jQuery UI自动完成小部件完全集成。并且它可以在同一页面上的多个插件实例中使用。
:o)