Я разрабатываю систему, которая позволяет пользователям аннотировать элементы строками или терминами из словаря. Я использую написание Twitter для автозаполнения и хочу различать введенную строку и термин.
Я не могу понять, как различать следующие ситуации:
- пользователь нажимает Enter после того, как придумал собственное значение
- пользователь нажимает стрелку вниз (или вверх) (тем самым выбирает вариант автозаполнения) и нажимает клавишу ввода
Слушатели событий я написал:
$("#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>
Первый слушатель улавливает все выбранные термины с опережением ввода, что позволяет правильно сохранить термин. Проблема в том, что второй прослушиватель также запускается в случае, если пользователь нажимает и вводит, выбирая термин, предшествующий типу, который теперь также сохраняется в виде простой строки. Есть ли способ не запускать второй слушатель, если выбрано предложение с опережением типа?
Скрипка с загруженным кодом: https://jsfiddle.net/zban3vs6/1/
Изменить: я рассмотрел несколько хаков, но у всех есть свои проблемы:
Добавьте специальный символ в строку, отображаемую во входных данных в момент ее выбора, путем добавления настраиваемого отображения Typeahead: https://jsfiddle.net/2t9rzhwf/ Это вызывает введение дополнительного символа, что вызывает проблемы, если пользователь нажимает стрелку вниз, не нажимая Enter.
Попытайтесь упорядочить слушателей, сначала попросите термин «триггер слушателя», установите для логического значения true и отфильтруйте это логическое значение во втором слушателе. Не нравится такой способ фильтрации, так как он вносит задержку.
Решение, предоставляемое @ peter-clause, проверяет, находится ли выбранное значение в списке доступных элементов. Но таким образом я не могу отслеживать, намеревался ли пользователь использовать опцию автозаполнения для выбора термина или явно добавляет простую строку.