Я испытываю много затруднений, заставляющих виджет автоматического заполнения jQuery работать на меня. Я использую список пар ключ/значение с сервера.
У меня есть следующие требования:
Если пользователь выбирает значение из виджета, я хочу передать идентификатор серверу.
Если пользователь не выбирает значение и вводит необработанный текст или изменяет значение, которое было уже выбрано, я хочу, чтобы поле ID было очищено и просто необработанный текст, который будет отправлен на сервер.
Примите это someAjaxFunction
возвращает массив объектов, которые ожидает виджет автоматического заполнения: {label:label, value:key}
.
Первоначально я настроил виджет автоматического заполнения как так:
$(input).autocomplete({
source: sourceFunction,
minLength: 1
});
Изменение выбора даже путем парения над одним из объектов изменяет текст в текстовом поле, на которое ссылается $ (вход) к базовому ключу, а не маркировка. Это очень нежелательно с точки зрения взаимодействия с пользователем - действительно, самая причина, почему я занимаюсь расследованиями, это вызвано тем, что пользователи сайта, которых я создаю, последовательно экранировались текстом, который они ввели по-видимому превращающийся в случайные числа!
Я добавил скрытое поле под текстовым полем и реализовал выбор () и фокус () события для сокрытия идентификатора как так:
$(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
});
Это работает хорошо, когда пользователь придерживается сценария, предоставленного выпадающим автоматическим заполнением. Идентификатор скрыт и правильно отправлен серверу. К сожалению, если пользователь хочет ввести некоторый текст свободной формы в поле и поиск на основе того значения, поле ID не сбрасывается, и ранее выбранный идентификатор отправлен серверу. Это также довольно сбивает с толку.
Документация Автоматического заполнения UI jQuery перечисляет a change
событие и состояния, что item
свойство ui
аргумент будет установлен на выбранный пункт. Я полагал, что мог сбросить скрытое идентификационное поле на нажатии клавиши и повторно заполнить идентификатор, если автоматическое заполнение изменяется. К сожалению, в дополнение к событию нажатия клавиши, получая целый набор нажатий клавиш, которые не должны сбрасывать идентификатор, return false
оператор в вышеупомянутом select
событие, которое необходимо для управления текстом в текстовом поле, предотвращает change
событие от наличия ui.item правильно присвоенный.
Таким образом, теперь я застреваю - я действительно не знаю то, что еще я могу попытаться сделать функциональностью поддержки виджета, что кажется, что это должно поддерживать по умолчанию. Или этот процесс является путем, более сложным, чем это должно быть, или я пропускаю что-то действительно очевидное. Я выбрал через все доступные события и все примеры и подошел пустой врученный. На самом деле даже "Пользовательские данные и дисплей" пример на странице UI jQuery страдают от этой проблемы.
Я могу добавить некоторые взломы в стороне сервера для покрытия для этого, но я действительно предпочел бы мочь сделать это на клиентском уровне.
Я также предпочел бы придерживаться виджета автоматического заполнения UI jQuery, а не переключаться на другой.
Я использую автозаполнение для создания контейнера div, содержащего ввод. Когда я выбираю элемент, я добавляю ссылку, содержащую диапазон, в контейнер и скрываю поле ввода.
Ссылка и диапазон имеют такой стиль, что они выглядят как кнопка с X и имеют обработчик событий щелчка для удаления записи из DOM, очистки скрытого поля и повторного отображения поля ввода при нажатии. Итак, когда элемент выбран:
<div class="container">
<a href="#"><span>Selected Item</span></a>
<input id="myautocomplete" type="text" />
<input type="hidden" name="myvalue" value="1" />
</div>
И когда элемент не выбран:
<div class="container">
<input id="myautocomplete" name="myautocomplete" type="text" />
<input id="myvalue" name="myvalue" type="hidden" value="" />
</div>
Таким образом, вы либо вынуждены выбрать элемент, либо вводите текст в произвольной форме. На бэкэнде, если параметр запроса с ключом myvalue пуст, вам лучше посмотреть параметр запроса с ключом myautocomplete.