Подтвердить что ты не робот

JQuery UI autocomplete - Скрыть список после нажатия

У меня есть вход. Я использую автозаполнение JQuery UI для предложения предложений пользователю. Получает изображение, которое у меня есть в моем списке. 3 элемента: item1, item2, item3. Я ищу список, который будет закрыт, когда пользователь попадет в поле ввода. Например, если пользователь только вводит "он", будут отображаться все 3 элемента. В этом случае, если он попадает в ящик, я хотел бы, чтобы список был закрыт. Я не могу придумать решение для этого. Надеюсь, кто-то может помочь. Приветствия. Марк.

http://jsfiddle.net/vXMDR/

Мой html:

<input id="search" type="input" />​

Мои js:

$(function() {

    var availableTags = [
            "item1","item2","item3"
        ];

    $("#search").autocomplete({
        source:availableTags,
        minLength: 0
        });
});​
4b9b3361

Ответ 1

$(function() {

    var availableTags = [
            "item1","item2","item3"
        ];

    $("#search").autocomplete({
        source:availableTags,
        minLength: 0
    }).keyup(function (e) {
        if(e.which === 13) {
            $(".ui-menu-item").hide();
        }            
    });
});​

http://jsfiddle.net/vXMDR/2/

Ответ 2

Вот решение: http://jsfiddle.net/vXMDR/3/

Сообщите мне, если у вас есть вопросы.

Магия связывает метод закрытия автозаполнения с нажатием

 $("#search").keypress(function(e){ 
    if (!e) e = window.event;   
    if (e.keyCode == '13'){
      $('#search').autocomplete('close');
      return false;
    }
  });

UPDATE

$("#search").keypress(function(e){ связывает нажатие элемента #search с указанной функцией, передавая объект event. Вы также можете записать это как $("#search").on('keypress', function(e) {...

if (!e) e = window.event; гарантирует, что если действительное событие не было передано, оно устанавливает e в текущий объект window.event.

Наконец, if (e.keyCode == '13'){ проверяет, что значение ключа события равно ключу 'enter'. Список действительных кодов клавиш см. Здесь.

Вот документация для метода закрытия автозаполнения - http://docs.jquery.com/UI/Autocomplete#method-close

Ответ 3

Я также модифицировал решение shanabus, чтобы учесть временную задержку из-за обратного вызова.

http://jsfiddle.net/vXMDR/46/

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

shouldComplete = true;

$("#search").autocomplete({
    source:function (request, response) {            
        setTimeout(
            function() {
                response(shouldComplete ? availableTags : null);
            },
            2000);
    }        
    ,
    minLength: 0
    });

Затем, когда нажата кнопка ввода, флаг имеет значение false. Любой другой ключ активирует флаг.

$("#search").keypress(function(e){
    if (!e) e = window.event;   
    if (e.keyCode == '13'){
      $('#search').autocomplete('close');
        shouldComplete = false;
      return false;
    }
        else
        {
            shouldComplete = true;
        }
  });

Можно сделать это более элегантно, я уверен, но это устраняет проблему, о которой может показаться ниже.

Ответ 4

Я столкнулся с этой проблемой и не смог использовать метод close(), потому что моя автозаполнение повторно отображалось при каждой загрузке представления Backbone. Таким образом, новый новый элемент автозаполнения был добавлен в DOM и те, которые застряли, несмотря на то, что прикрепленный элемент ввода сдувался и воссоздавался. Излишние элементы автозаполнения вызывали несколько проблем, но хуже всего было то, что пользователь нажал достаточно быстро, я бы прошел через эту последовательность:

  • Текст пользовательских типов
  • Запрос предложений начинается с выполнения
  • Событие нажатия клавиши запускается и выполняет полнотекстовый поиск (пользователь не выбрал что-то из автозаполнения)
  • Повторно загружается представление, поле ввода и другие элементы и добавляется новый элемент автозаполнения в конец DOM
  • Исходный запрос предложений возвращается с ответом и отображаются предложения.

Обратите внимание, что предложения, отображаемые на шаге 5, теперь привязаны к контейнеру автозаполнения, который больше не связан с моим полем ввода, поэтому любые события, такие как нажатие esc или щелчок в другом месте экрана, ничего не будут делать. Предложения застревают там до полной перезагрузки страницы.

Я закончил это исправлением, сохранив mainContainerId самого недавно созданного элемента автозаполнения и удалив его вручную.

// during rendering
self.currentAutoComplete = $("#input-element").autocomplete({
  // set options
});

// later
if (this.currentAutoComplete) {
  $("#" + this.currentAutoComplete.mainContainerId).remove();
}