Автозаполнение запрещает ввод свободного текста?

Можно ли запретить ввод свободного текста в виджете автозаполнения пользовательского интерфейса JQuery?

например, я хочу, чтобы пользователю было разрешено выбирать из списка элементов, представленных в списке автозаполнения, и я не хочу, чтобы они могли писать случайный текст.

Я не видел ничего в демо/документах, описывающих, как это сделать.

http://jqueryui.com/demos/autocomplete/

Я использую автозаполнение, как это

$('#selector').autocomplete({
    source: url,
    minlength: 2,
    select: function (event, ui) {
        // etc
    }

person JK.    schedule 25.05.2010    source источник


Ответы (7)


Одним из способов было бы использовать дополнительную проверку при отправке формы (если вы используете форму), чтобы выделить ошибку, если текст не является одним из допустимых вариантов.

Другим способом было бы присоединение к событию изменения автозавершения, которое будет запущено, даже если параметры не выбраны. Затем вы можете выполнить проверку, чтобы убедиться, что пользовательский ввод находится в вашем списке, или отобразить ошибку, если это не так.

person Aaron Janes    schedule 25.05.2010
comment
Я пошел с событием .change(), это было проще и быстрее, чем пытаться изменить решение поля со списком, чтобы оно подходило. - person JK.; 26.05.2010
comment
@Neils указал ниже другой ответ, и это сработало как изменение шарма: function(event,ui) { if (ui.item==null) { $(#your_input_box).val(''); $(#your_input_box).focus(); } } - person Sandeep; 06.08.2014

Согласно документации по API, свойство ui события change имеет значение null, если запись не была выбрана из list, поэтому вы можете запретить свободный текст так же просто, как это:

$('#selector').autocomplete({
    source: url,
    minlength: 2,
    change: function(event, ui) {
        if (ui.item == null) {
          event.currentTarget.value = ''; 
          event.currentTarget.focus();
        }
    }
});
person Neils    schedule 29.03.2013
comment
Работал для меня, хороший :) - person littledynamo; 08.08.2013
comment
У меня тоже сработало ;) - person bungdito; 26.08.2013
comment
change: (e, ui) -> ($ '#input_box').val('').focus() if not ui.item для кофескриптеров. - person Dom Vinyard; 19.02.2014
comment
event.currentTarget.value = ''; event.currentTarget.focus(); есть ли случаи, когда это не сработало? - person MrYellow; 27.08.2015
comment
Лучший ответ - это правильный способ справиться с этим. - person Egli Becerra; 17.08.2017
comment
работает идеально. при изменении автозаполнения, если элемент не выбран, установите значение val равным нулю. Ничего страшного - person Cesar BA; 10.02.2018
comment
Должен быть принят ответ! Я бы предложил $(this).val(""); $(this).focus(); - person Dan; 31.03.2019
comment
По сути, это очищает ошибочно введенные тексты и возвращает фокус в поле, если кто-то вводит недопустимый вариант, а затем нажимает вкладку. Но это ничего не даст, если они введут не-опцию и нажмут Enter :| Пример поля со списком делает что-то вроде этого (но показывает всплывающую подсказку, если он недействителен): jqueryui.com/autocomplete/#combobox< /а> - person rogerdpack; 29.12.2019

Если вы хотите, чтобы пользователь просто получил элемент из списка, используйте поле со списком автозаполнения.

http://jqueryui.com/demos/autocomplete/#combobox

ХТН

person Raja    schedule 25.05.2010
comment
Вы все еще можете напечатать это, это именно то, что он сказал, что не хочет. - person Chad Birch; 26.05.2010
comment
Нет, я не думаю, что он этого хочет. Я думаю, что он хочет получить его из элемента из списка, т.е. если пользователь начинает вводить Ja, то если он перечисляет Java и Javascript, то он хочет, чтобы пользователь выбрал один из них, а не ввод Jab и отправку. - person Raja; 26.05.2010
comment
Нет, я сказал автозаполнение, что означает, что ввод разрешен. Но ввод должен быть ограничен только элементами в списке автозаполнения. Пример со списком делает именно это. - person JK.; 26.05.2010
comment
Combobox функционально идеален, но пользовательский интерфейс плохой - он сильно отличается от стандартного ‹ select›, поэтому я не могу его использовать. Я рассмотрю пример более подробно, чтобы увидеть, можно ли опустить кнопку раскрывающегося списка. - person JK.; 26.05.2010
comment
Я тот, кто неправильно понял, чего он хотел тогда. Сделал неуместное редактирование этого ответа, чтобы я мог отозвать свой отрицательный голос. - person Chad Birch; 26.05.2010

Я использовал модуль со списком, который дает вам кнопку «стрелка вниз». Затем к тегу ввода просто добавьте следующее в тег ввода прямо вокруг строки 41 (в зависимости от вашей версии поля со списком http://jqueryui.com/demos/autocomplete/#combobox )

input.attr("только для чтения", "только для чтения");

Затем добавьте код, чтобы, если пользователь щелкнет поле ввода, он отобразил раскрывающийся список.

Для своих целей я добавил флаг только для чтения, который я могу передать модулю, поэтому, если он мне нужен только для чтения, я также могу включить или выключить его.

person Mike    schedule 03.05.2012

Старый вопрос, но вот:

    var defaultVal = '';
    $('#selector').autocomplete({
        source: url,
        minlength: 2,
        focus: function(event, ui) {
            if (ui != null) {
                defaultVal = ui.item.label;
            }
        },
        close: function(event, ui) {
            $('#searchBox').val(defaultVal);
        }
    });
person Joe    schedule 28.08.2012

Если вы хотите, чтобы пользователь мог выбрать рекомендацию из списка автозаполнения, попробуйте определить функцию закрытия следующим образом. Функция закрытия вызывается, когда раскрывающийся список результатов закрывается, если пользователь выбрал из списка, то определяется event.currentTarget, если нет, то раскрывающийся список результатов закрывается без выбора пользователем опции. Если они не выбирают вариант, я сбрасываю ввод на пустой.

/**
 * The jQuery UI plugin autocomplete
 */
$.widget( "ui.autocomplete", $.ui.autocomplete, {
   options: {
      close: function( event, ui ) {
         if (typeof event.currentTarget == 'undefined') {
            $(this).val("");
         }
      }
   }
 });
person user7793758    schedule 24.10.2019
comment
Хотя этот фрагмент кода может быть решением, включая объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос для будущих читателей, и эти люди могут не знать причин вашего предложения кода. - person nircraft; 24.10.2019
comment
В этом конкретном примере я расширяю виджет автозаполнения пользовательского интерфейса, чтобы он вел себя таким образом, поэтому мне не нужно исправлять каждое место, где он встречается в моем приложении. Если у вас их всего несколько, просто определите функцию закрытия и не беспокойтесь о расширении виджета. - person user7793758; 24.10.2019

Опция combobox хорошо работает, если вы используете набор списков, однако, если у вас есть динамически сгенерированный список с помощью json get, вы можете собирать данные только при изменении.

Полный пример с дополнительными параметрами ниже.

        $("#town").autocomplete(
        {       
            select: function( event, ui ) {
                $( "#town" ).val( ui.item.value );
                return false;
            },        
            focus: function( event, ui ) {
                    $( "#town" ).val( ui.item.label );
                    return false;
                },           
            change: function(event, ui) {
                if (!ui.item) {
                    $("#town").val("");
                }
            },
            source: function(request, response) {
                $.ajax({
                    url: 'urltoscript.php',
                    dataType: "json",
                    data: {
                        term : request.term,
                        country : $("#abox").val()    // extra parameters
                    },                        
                    success: function(data) {
                        response($.map(data,function (item)
                        {                                
                            return {
                                id: item.id,
                                value: item.name
                            };
                        }));
                    }
                });
            },
            minLength: 3
            , highlightItem: true                                
        });
person PodTech.io    schedule 15.01.2017