У меня много проблем с работой виджета автозаполнения 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
});
Это хорошо работает, когда пользователь придерживаетсяСценарий, предоставляемый раскрывающимся списком автозаполнения.Идентификатор скрыт и правильно передан на сервер.К сожалению, если пользователь хочет ввести какой-либо текст произвольной формы в поле и выполнить поиск на основе этого значения, поле идентификатора не сбрасывается, а ранее выбранный идентификатор отправляется на сервер.Это также довольно запутанно.
В документации по автозаполнению пользовательского интерфейса jQuery перечислено событие change
и указано, что свойство item
аргумента ui
будет установлено для выбранного элемента.Я подумал, что могу сбросить скрытое поле идентификатора при нажатии клавиши и повторно заполнить идентификатор, если автозаполнение изменилось.К сожалению, в дополнение к событию нажатия клавиш, захватывающему целую кучу нажатий клавиш, которые не должны сбрасывать идентификатор, оператор return false
в вышеупомянутом событии select
, который необходим для управления текстом в текстебокс не позволяет событию change
правильно назначить ui.item.
Так что теперь я застрял - я не знаю, что еще я могу попытаться сделать так, чтобы виджет поддерживал функциональность так, как кажетсядолжен поддерживать по умолчанию.Либо этот процесс намного сложнее, чем должен быть, или я упускаю что-то действительно очевидное.Я просмотрел все доступные события и все примеры и пришел с пустыми руками.Фактически, даже пример «Пользовательские данные и отображение» на странице пользовательского интерфейса jQuery страдает от этой проблемы.
Я могу добавить некоторые хаки на стороне сервера, чтобы покрыть это, но я действительно предпочел бы иметь возможностьчтобы сделать это на уровне клиента.
Я бы также предпочел придерживаться виджета автозаполнения пользовательского интерфейса jQuery, а не переключаться на другой.