У меня возникли проблемы с созданием виджета автозаполнения jQuery для меня. Я использую список пар ключ/значение с сервера.
У меня следующие требования:
Если пользователь выбирает значение из виджета, я хочу передать идентификатор на сервер.
Если пользователь не выбирает значение и не вводит необработанный текст или не изменяет значение, которое уже было выбрано, я хочу, чтобы поле идентификатора было очищено и только исходный текст был отправлен на сервер.
Предположим, что someAjaxFunction
возвращает массив объектов, которые ожидает виджет автозаполнения: {label:label, value:key}
.
Сначала я установил виджет автозаполнения так:
$(input).autocomplete({
source: sourceFunction,
minLength: 1
});
Изменение выбора даже путем зависания над одним из элементов изменяет текст в текстовом поле, на который ссылается $(ввод), на основной ключ, а не на метку. Это очень нежелательно с точки зрения взаимодействия с пользователем - действительно, сама причина, по которой я исследую это, заключается в том, что пользователи сайта, который я создаю, постоянно сбиты с толку текстом, который они ввели, казалось бы, превратившись в случайные числа!
Я добавил скрытое поле в текстовое поле и реализовал события 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
});
Это хорошо работает, когда пользователь придерживается script, предоставленного раскрывающимся списком автозаполнения. Идентификатор маскируется и правильно отправляется на сервер. К сожалению, если пользователь хочет ввести некоторый текст свободной формы в поле и выполнить поиск на основе этого значения, поле ID не будет reset, а ранее выбранный идентификатор будет отправлен на сервер. Это также довольно запутанно.
В документации по автозаполнению пользовательского интерфейса jQuery указано событие change
и указано, что свойство item
аргумента ui
будет установлено на выбранный элемент. Я решил, что я могу reset скрытое поле id при нажатии клавиши и повторно заполнять идентификатор, если изменяется автозаполнение. К сожалению, в дополнение к событию нажатия клавиши, содержащему целую цепочку нажатий клавиш, которая не должна reset идентификатора, оператор return false
в предыдущем случае select
, который необходим для управления текстом в текстовом поле, предотвращает change
от правильного присвоения ui.item.
Итак, теперь я застрял - я действительно не знаю, что еще я могу попытаться сделать функциональностью поддержки виджета, которая, похоже, должна поддерживаться по умолчанию. Либо этот процесс намного сложнее, чем должен быть, или я пропускаю что-то действительно очевидное. Я выбрал все доступные события и все примеры и пришел с пустыми руками. На самом деле даже пример "Пользовательские данные и отображение" на странице пользовательского интерфейса jQuery страдает этой проблемой.
Я могу добавить некоторые хаки на серверной стороне, чтобы покрыть это, но я действительно предпочел бы сделать это на уровне клиента.
Я также предпочел бы придерживаться виджета автозаполнения jQuery UI, а не переключаться на другой.