Может быть, это просто потому, что это старая проблема, но я обнаружил, что самое простое решение уже есть в плагине, вам просто нужно использовать соответствующие функции для доступа к нему.
Этот код будет обрабатывать случаи, когда автозаполнение теряет фокус с недопустимым значением:
change: function(e, ui) {
if (!ui.item) {
$(this).val("");
}
}
И этот код, так же, как и исходная функциональность bassistance, будет обрабатывать случаи, когда при автозаполнении нет совпадений:
response: function(e, ui) {
if (ui.content.length == 0) {
$(this).val("");
}
}
Это хорошо работает как с источником статического массива, так и с источником данных JSON. В сочетании с параметром autoFocus: true
он, кажется, делает все необходимое эффективным образом.
Последний случай, который вы, возможно, захотите обработать, - это что делать, когда нажата клавиша ESCAPE с недопустимым значением в текстовом поле. Что я делаю, так это использую значение первого соответствующего результата. И вот как я это делаю ...
Сначала объявите переменную, которая будет содержать лучшее совпадение. Делайте это за пределами вашего плагина автозаполнения.
var bestMatch = "";
Затем используйте следующую опцию:
open: function(e, ui) {
bestMatch = "";
var acData = $(this).data('uiAutocomplete');
acData.menu.element.find("A").each(function () {
var me = $(this);
if (me.parent().index() == 0) {
bestMatch = me.text();
}
});
}
Наконец, добавьте следующее событие к вашему автозаполнению:
.on("keydown", function(e) {
if (e.keyCode == 27) // ESCAPE key
{
$(this).val(bestMatch);
}
})
Вы также можете легко заставить поле быть пустым при нажатии клавиши выхода. Все, что вам нужно сделать, это установить значение пустой строки при нажатии клавиши вместо переменной bestMatch
(которая вообще не нужна, если вы решите очистить поле).