jquery autocomplete plugin を使用する場合、ユーザーがリスト内の項目を選択せず、代わりに有効な値を入力してタブを離れる場合はどうしますか?
たとえば、オートコンプリートリストに次が含まれる場合:
Cat
Dog
Fish
また、ユーザーはcat
と入力しますが、オートコンプリートのドロップダウンリストからCat
を選択せず、代わりにタブを使用します。リストから項目を選択しなかったため、オートコンプリート選択イベントは発生せず、それに応答する機会を失います。
$('#Animal').autocomplete({
source: url,
minlength: 1,
select: function (event, ui) {
$("#Animal").val(ui.item.value);
changeUsersAnimal(ui.item.id);
}
});
このケースをどのように処理しますか?
おそらく ScottGonzález 'autoSelect
extension を探しているでしょう。この拡張機能をページに含めるだけで、ユーザーが有効な値を入力し、変更を必要としない場合にselect
イベントを起動できます。
/*
* jQuery UI Autocomplete Auto Select Extension
*
* Copyright 2010, Scott González (http://scottgonzalez.com)
* Dual licensed under the MIT or GPL Version 2 licenses.
*
* http://github.com/scottgonzalez/jquery-ui-extensions
*/
(function( $ ) {
$.ui.autocomplete.prototype.options.autoSelect = true;
$( ".ui-autocomplete-input" ).live( "blur", function( event ) {
var autocomplete = $( this ).data( "autocomplete" );
if ( !autocomplete.options.autoSelect || autocomplete.selectedItem ) { return; }
var matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "$", "i" );
autocomplete.widget().children( ".ui-menu-item" ).each(function() {
var item = $( this ).data( "item.autocomplete" );
if ( matcher.test( item.label || item.value || item ) ) {
autocomplete.selectedItem = item;
return false;
}
});
if ( autocomplete.selectedItem ) {
autocomplete._trigger( "select", event, { item: autocomplete.selectedItem } );
}
});
}( jQuery ));
拡張機能を使用した例を次に示します: http://jsfiddle.net/vFWUt/226/
JQueryバージョン1.8以降では、trueに設定されたautoFocusオプションを使用します
$( ".selector" ).autocomplete({ autoFocus: true });
これには、リストの最初の項目を自動的に選択するという追加の利点があり、ユーザーはEnterキーまたはTabキーを押すだけですべての名前を入力しなくても選択できます。
Onchangeのカスタムイベントを追加する
$('#Animal').change(function(){
var selectedValue = this.value;
// Do what you want here:
...
});
または、ウィジェットの組み込みchange
イベントを使用します:
$('#Animal').autocomplete({
source: url,
minlength: 1,
select: function (event, ui) {
$("#Animal").val(ui.item.value);
changeUsersAnimal(ui.item.id);
}
change: function(event, ui) { // <=======
// ...
// ...
}
});
JQuery UI 1.9.2の場合、Andrew Whitakerの答えでScottGonzálezのautoSelect拡張を少し変更する必要がありました。
var item = $( this ).data( "item.autocomplete" );
することが
var item = $( this ).data( "uiAutocompleteItem" );
そしてそれは完全に動作します。
このように使用できます
$("#inputbox").autocomplete({
source : reuesturl,
minLength : 1,
select : function(event, ui) {
$("#inputbox").attr('rel',ui.item.label);
},
open : function() {
$("#inputbox").attr('rel', 0);
},
close : function() {
if ($("#inputbox").attr('rel')=='0')
$("#inputbox").val('');
}
});
jQuery UI - v1.11.0
については、次のように少し変更する必要がありました ScottGonzálezのautoSelect拡張機能 。
/*
* jQuery UI Autocomplete Auto Select Extension
*
* Copyright 2010, Scott González (http://scottgonzalez.com)
* Dual licensed under the MIT or GPL Version 2 licenses.
*
* http://github.com/scottgonzalez/jquery-ui-extensions
*/
$().ready(function () {
$.ui.autocomplete.prototype.options.autoSelect = true;
$(".ui-autocomplete-input").change(function (event) {
var autocomplete = $(this).data("uiAutocomplete");
if (!autocomplete.options.autoSelect || autocomplete.selectedItem) { return; }
var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex($(this).val()) + "$", "i");
autocomplete.widget().children(".ui-menu-item").each(function () {
var item = $(this).data("uiAutocompleteItem");
if (matcher.test(item.label || item.value || item)) {
autocomplete.selectedItem = item;
return false;
}
});
if (autocomplete.selectedItem) {
autocomplete._trigger("select", event, { item: autocomplete.selectedItem });
}
});
});
また、オートコンプリートの定義で拡張オートコンプリートオプションautoSelect: true
を適用する必要がありました。
私はこれらの答えから少しコードを取りました。
誰かが興味を持っている場合のために、これが私のオートコンプリートの定義です。
$("your selector").autocomplete({
// Below filter looks for the values that start with the passed in string
source: function (request, response) {
var matches = $.map(yourSourceArray, function (acItem) {
if (acItem.toUpperCase().indexOf(request.term.toUpperCase()) === 0) {
return acItem;
}
});
response(matches);
},
// one can directly pass the source array instead like,
// source: yourSourceArray
autoSelect: true,
autoFocus: true,
minLength: 3,
change: function (event, ui) {
if (ui.item) {
// do whatever you want to when the item is found
}
else {
// do whatever you want to when the item is not found
}
}
})
次のコードは、jquery ui 1.10.3バージョンで動作するようにScottの拡張機能を少し調整したものです。以下のコードは、バージョン1.10.3でのみテストしました。
(function($) {
$.ui.autocomplete.prototype.options.autoSelect = true;
$( ".ui-autocomplete-input" ).live( "blur", function( event ) {
var autocomplete = $( this ).data( "ui-autocomplete" );
if ( ! autocomplete.options.autoSelect || autocomplete.selectedItem ) { return; }
var matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "$", "i" );
autocomplete.widget().children( ".ui-menu-item" ).each(function() {
var item = $( this ).data( "ui-autocomplete-item" );
if ( matcher.test( item.label || item.value || item ) ) {
autocomplete.selectedItem = item;
return false;
}
});
if ( autocomplete.selectedItem ) {
autocomplete._trigger( "select", event, { item: autocomplete.selectedItem } );
}
});
}(jQuery));
Jquery-UI 1.12で動作するようにScott Gonzalezのコードを更新
(function($) {
$.ui.autocomplete.prototype.options.autoSelect = true;
$('body').on('blur', '.ui-autocomplete-input', function(event) {
var autocomplete = $(this).data('ui-autocomplete');
if (!autocomplete.options.autoSelect || autocomplete.selectedItem) { return; }
var matcher = new RegExp($.ui.autocomplete.escapeRegex($(this).val()), 'i');
autocomplete.widget().children('.ui-menu-item').each(function(index, item) {
var item = $( this ).data('uiAutocompleteItem');
if (matcher.test(item.label || item.value || item)) {
autocomplete.selectedItem = item;
return false;
}
});
if (autocomplete.selectedItem) {
autocomplete
._trigger('select', event, {item: autocomplete.selectedItem});
}
});
}(jQuery));
Jquery 1.9.1とjquery-ui 1.10.3を使用しているページで、この関数に問題がありました。 Scott Gonzalezのコードとここでの提案、および数時間のスラッシングに基づいて、次のことを思いつきました。注:オートコンプリートによって提案された値の1つのみをユーザーが入力できるソリューションが必要でしたが、ユーザーがドロップダウンから選択せずに許可された値の1つを入力するだけのケースを許可したかったのです。
/*
* jQuery UI Autocomplete Auto Select Extension
*
* v 1.10
* Jomo Frodo ([email protected])
*
* This version requires an autoSelect parameter to be set on the autocomplete widget
*
* e.g.,
* $("#autoCompleteID").autocomplete({
source:url,
minLength:1,
autoSelect: true
});
*
* Based on an extension by Scott González (http://scottgonzalez.com)
* http://blog.jqueryui.com/2010/08/extensible-autocomplete/
* Dual licensed under the MIT or GPL Version 2 licenses.
*
* http://github.com/scottgonzalez/jquery-ui-extensions
*/
$(window).load(
function() {
//$.ui.autocomplete.prototype.options.autoSelect = true;
// Doesn't appear to work in ui 1.10.3
// Must set the 'autoSelect' param on the autocomplete widget to get this to work.
$(".ui-autocomplete-input").bind('autocompleteresponse',
function(event, ui) {
$(this).data('menuItems', ui.content);
});
$(".ui-autocomplete-input").on(
"blur",
null,
function(event) {
var autocomplete = $(this).data("uiAutocomplete");
if (!autocomplete.options.autoSelect
|| autocomplete.selectedItem) {
return;
}
var matcher = new RegExp("^"
+ $.ui.autocomplete.escapeRegex($(this).val())
+ "$", "i");
var menuItems = $(this).data('menuItems');
for (idx in menuItems) {
var item = menuItems[idx];
if (matcher.test(item.value)) {
autocomplete.selectedItem = item;
break;
// return false;
}
}
if (autocomplete.selectedItem) {
autocomplete._trigger("select", event, {
item : autocomplete.selectedItem
});
} else {
this.value = '';
}
});
});
使用する autoFocus: true
$('#Animal').autocomplete({
source: url,
**autoFocus: true,**
minlength: 1,
select: function (event, ui) {
$("#Animal").val(ui.item.value);
changeUsersAnimal(ui.item.id);
}
});
このコードは一度だけ自動選択します。その後のすべては何もしません。何か案は?
編集:私はこの行をコメントアウトし、今では動作します。理由がわからない。
if ( !autocomplete.options.autoSelect || autocomplete.selectedItem ) { return; }