Опять встала проблема найти что-то легковесное и удобное, на это раз нужен был автокомплитер (подсказчик).
Select2, конечно, восхитителен, но дюже тяжел, непривычен по дизайну и умеет делать гораздо больше, чем нужно.
Остальные варианты, которые удалось нарыть в просторах интернета, почему-то все поголовно уверены, что элементы автокомплита всегда ищутся по их названию, синонимов, как и каких-либо других полей у них быть не может.
А если у меня города, и я хочу чтобы при вводе слова Питер или Петербург, ну или Petersburg всплывал Saint Petersburg? Нее, не слышал! А на самом деле это очень распространенная задача, когда за несколькими различными словами скрывается какое-то одно значение.
Опять придется самому делать. Хотя как всегда - инет большой - может плохо смотрел.
Поскольку я, как и любой программист, ленив - часть CSS и суть работы некоторых блоков взял из мода довольно распространенного автокомплитера отсюда.
Требования к автокомплитеру
возможность быстрого "прикрепления" на поле ввода
возможность иметь несколько синонимов одного значения
возможность сохранять произвольные поля для элемента и обращаться к ним
возможность работы как с локальным массивом, так и с подгружаемыми данными
Что получилось
Демо
автокомплитер, использующий массив
автокомплитер, использующий подгрузку и обработку событий (подсказка)
API
Создание
var ac = $ ( селектор текстового поля ).autocompleter( data, options );
data
URL для загрузки данных либо массив данных
options
дополнительный настройки:
method
POST / GET (по умолчанию POST)
paramName
название переменной, куда пишется строка запроса (по умолчанию q)
dataType
формат ожидаемых данных (по умолчанию json)
inputClass
имя класса для поля ввода
resultsClass
имя класса для блока результата
loadingClass
имя класса при ожидании результатов с сервера
selectedClass
имя класса когда поле с выбранным элементом
minChars
кол-во символов, после которых идет поиск (по умолчанию 1)
delay
время ожидания в миллисекундах после нажатия клавиши и до попытки поиска (по умолчанию 400)
cacheLength
максимальное число кэшируемых результатов поиска (если 0 - кэширование будет отключено, -1 - бесконечно, по умолчанию 10)
maxItemsToShow
максимальное кол-во результатов в списке (если -1 - без ограничений, по умолчанию -1)
mustMatch
если true, и элемент не выбран, после потери фокуса оно очистится
extraParams
объект, - дополнительные параметры при запросе на сервер
width
ширина выпадающего списка (если 0 - рассчитывается автоматически = ширине поля ввода, по умолчанию 0)
height
максимальная высота выпадающего списка, если элементов больше - пояыляется прокрутка (если 0 - неограниченна, по умолчанию 0)
highlightFirst
если true при появлении результатов, первый из них автоматически подсвечивается (по умолчанию false)
msgNotFound
сообщение, показываемое, если ничего не найдено (по умолчанию not found...)
msgServerError
сообщение, показываемое при ошибке сервера (по умолчанию server error...)
msgError
сообщение, показываемое при других ошибках (по умолчанию error...)
parseData
функция преобразования входных данных
formatItem
функция формирования вида элемента списка
eventsHandler
функция обработки событий
Формат данных
Данные, пересылаемые как JSON, или объявленные и переданные как массив должны быть в минимально необходимом виде такими:
Если у элемента присутствуют дополнительные поля, кроме минимально необходимых - они сохранятся в нем и их можно будет потом использовать.
Запрос на данные идет вида POST со строкой в переменной q.
Функция преобразования входных данных
function parseData( items ){ ... return items;}
items
входные данные
Функция формирования вида элемента списка
function formatItem( container, item, itemNumber, items, itemsLen ){
...
return{
html:(null или строка или DOM объект),- html / DOM объект данного элемента списка,
value: строка,- значение, помещаемое при выборе в поле ввода
};}
container
DOM объект в котором будет храниться элемент и его данные
item
данные элемента
itemNumber
порядковый номер элемента в списке
items
данные всех элементов
itemsLen
количество всех элементов
Должна возвращать объект с полями:
html
HTML данного элемента (или null, если не нужно)
title
значение title для данного элемента (или null, если не нужно)
value
значение, помещающееся в поле ввода при выборе данного элемента
Функция обработки событий
function eventsHandler( event, obj, item, query ){ ... }
Значения event:
over / out
наведение / снятие наведения с элемента в списке (obj - DOM элемента, item - данные элемента)
select
выбор элемента в списке (obj - DOM элемента, item - данные элемента)
unselect
отмена выбора элемента (obj - null, item - данные элемента)
show / hide
показывание / скрытие списка (obj - DOM списка)
beforeRequest
вызывается до того, как пойдет запрос на поиск (obj - options, item - options.extraParams, query - строка запроса) в extraParams будет присутствовать свойство с именем, заданным paramName со значением, равным строке запроса данные в extraParams будут неизменным между запросами (кроме параметра с именем из paramName), если не менялись специально если при обработке этого события функция что-либо вернет, то данное значение будет использовано вместо extraParams
Методы: получить значение
ac.get();
Возвращает объект с двумя членами value - это то, что написано внутри контрола, и selected - это то, что было выбрано из списка (может быть null, если ничего не выбирали)
Выбранный элемент можно получить, обратившись к атрибуту data-selected текстового поля, на которое был установлен автокомплитер.
Методы: установить значение
ac.set( value, item, triggerEvent );
value
текст внутри контрола
item
объект устанавливаемого элемента
triggerEvent
true - для генерации событий изменения (может быть опущен, по умолчанию false)
Если опущены все параметры, контрол просто очищается.
Под "опущено" подразумевается значение undefined или null.