jQuery Автоматическое заполнение UI с гибридным поиском текста/идентификатора

Я испытываю много затруднений, заставляющих виджет автоматического заполнения 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, а не переключаться на другой.

11
задан Shabbyrobe 25 July 2010 в 01:46
поделиться

1 ответ

Я использую автозаполнение для создания контейнера 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.

2
ответ дан 3 December 2019 в 12:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: