2016-02-09 4 views
0

Я разрабатываю систему, которая позволяет пользователям аннотировать элементы с помощью строк или терминов из словаря. Я использую тип Twitter для автозаполнения и хочу различать введенную строку и термин.Twitter Typeahead различает события

Я не могу понять, как различать следующие ситуации:

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

слушателей событий я написал:

$("#itemInp").on('typeahead:select', function(event, term) { 
    console.log("save: term", term); 
}); 

$("#itemInp").on('keyup', function(event) { 
    if(event.which == 13) { 
     var string = $("#itemInp").val(); 
     console.log("save: string", string); 
    } 
}); 

Со следующей HTML:

<input id="itemInp"><input> 

Первым слушатель улавливает все выбранные условия машинописных, что позволяет должным образом экономии срока. Проблема в том, что второй прослушиватель также запускается, если пользователь нажимает и вводит, выбирая термин typeahead, который теперь также сохраняется как простая строка. Есть ли способ не запускать второй прослушиватель в случае выбора типа head?

скрипка с кодом нагруженным: https://jsfiddle.net/zban3vs6/1/

Edit: Я рассмотрел ряд взломов, но все приходят со своими проблемами:

  1. Добавить специальный символ в строку, показанной на входе в момент его выбора, добавив пользовательский дисплей Typeahead: https://jsfiddle.net/2t9rzhwf/ Это вызывает появление дополнительного символа, что является затруднительным, если пользователь нажимает стрелку вниз, не нажимая кнопку enter.

  2. Попытка упорядочить слушателей, сначала вызвать триггер слушателя, установить логическое значение в true и фильтровать на этом булевом во втором слушателе. Не нравится этот способ фильтрации, поскольку он вводит задержку.

  3. Решение, предоставляемое директивой @ peter-clause, проверяя, находится ли выбранное значение в списке доступных элементов. Но таким образом я не могу отслеживать, должен ли пользователь использовать опцию автозаполнения для выбора термина или явно, добавляет простую строку.

ответ

0

У меня была аналогичная проблема. Вот как я это решил.

var wasSelected = false; 
    $("#itemInp").on('typeahead:select', function(event, term) { 
     wasSelected = true; 
     console.log("save: term", term); 
    }); 

    $("#itemInp").on('change', function(event) { 
     if(!wasSelected) { 
      var string = $("#itemInp").val(); 
      console.log("save: string", string); 
     } 
     wasSelected = false;  
    }); 
+0

Спасибо, главное, что помогло мне обойти это, понимая, что порядок запуска слушателей не меняется. Мое решение больше специфично для реализации, я очищаю поле ввода в первом слушателе при использовании typeahead. Если второй слушатель встречается с полем, он не предполагает, что для этого случая не будет введен вход. – rasvaan

0

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

if (states.indexOf(string) == -1) { 
    //... 
} 

См https://jsfiddle.net/zban3vs6/2/

+0

Благодарим за ответ, но таким образом я не могу отслеживать, должен ли пользователь использовать параметр автозаполнения для выбора термина или явно добавляет простую строку. Я упростил пример, приложение использует typeahead, связанное с uris, для устранения неоднозначности выбранных терминов.Если кто-то, например, называет Алабаму, не нажимая вверх или вниз, чтобы выбрать предложение typeahead, я бы в этом случае сохранил его как термин, в то время как он должен быть сохранен как простая строка. – rasvaan

Смежные вопросы