JQuery Autocomplete: автозаполнение

Последнее обновление: 1.11.2015

Виджет autocomplete предназначен для создания специальных полей ввода с функцией автозаполнения:

В качестве источника автозаполнения указываем какой-нибудь массив и потом применяем виджет.

Подключение виджета к внешнему источнику

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

Выходная переменная $output содержит весь список в формате json. В реальности, конечно, все элементы списка, скорее всего, будут извлекаться из БД, но я для простоты упростил пример.

По сути каждый элемент списка - это объект, у которого определены два свойства: label (отображаемая метка) и value (само значение). В данном случае оба свойства по значению совпадают.

На стороне клиента прием мог бы выглядеть следующим образом:

$("input#lang").autocomplete({ source: function(request,response) { $.getJSON("json.php", { filter: $("input#lang").val() }, function(data){ var suggestions = ; // массив для хранения результатов $.each(data, function(key, val) { suggestions.push(val.value); // добавляем все элементы }); response(suggestions); }); } });

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

Стилизация виджета

При применении виджета к элементу input к данному элементу добавляется класс ui-autocomplete-input . А область списка автозаполения представляет собой список ul:

Изменив стили соответствующих классов, мы можем настроить отображение списка:

li.ui-menu-item { font-size: 12px; font-faminy: Verdana; } $(function(){ var langs = ["Java", "JavaScript", "VisualBasic", "PHP", "Pascal"] ; $("input#lang").autocomplete({ source: langs }); });

Свойства виджета

Виджет имеет следующие свойства:

    appendTo: указывает, какой элемент будет включать список для автозаполенния:

    $(function(){ var langs = ["Java", "JavaScript", "VisualBasic", "PHP", "Pascal"] ; $("input#lang").autocomplete({ appendTo: "#langsList", source: langs }); });

    autoFocus: при установке данного свойства в true выделяется первый элемент списка автозаполнения. По умолчанию свойство имеет значение false .

    delay: указывает в миллисекундах время задержки до показа списка автозаполенния ($("#langs").autocomplete({ delay: 500 });). По умолчанию данное свойство равно 300

    disabled: при установке у свойства значения true отключает виджет. По умолчанию имеет значение false .

    minLength: указывает на минимальное количество символов, которое должен ввести пользователь, чтобы отобразился список автозаполнения: $("#langs").autocomplete({ minLength: 0 }); . По умолчанию данное свойство имеет значение 1.

    position: используя данное свойство, можно задать положение списка на странице. Объект, с помощью которого можно задать положение, использует ряд опций, список которых можно найти на странице https://api.jqueryui.com/position/ . По умолчанию свойство имеет значение { my: "left top", at: "left bottom", collision: "none" } . Опция my указывает на позицию элемента списка автозаполнения, относительно которой идет выравнивание с элементом ввода. То есть left top выравнивает относительно левого верхнего угла. Опция at указывает уже позицию элемента ввода, относительно которой будет выравниваться список автозаполнения. Опция collision дополнительно настраивает отображение списка.

    Мы можем изменить начальные параметры, например, $("input#lang").autocomplete({ position: { my: "right top", at: "right bottom", collision: "fit" }, source: langs });

    source: задает источник для автозаполнения. Это может быть массив, который можно задать в качестве внешнего массива или прямо при свойстве: $("input#lang").autocomplete({ source: ["Java", "JavaScript", "VisualBasic", "PHP", "Pascal"]});

Методы виджета

Виджет autocomplete имеет следующие методы:

    autocomplete("close"): закрывает список ($("#lang").autocomplete("close");)

    autocomplete("disable"): отключает виджет

    autocomplete("enable"): подключает виджет автозаполнения

    autocomplete("destroy"): удаляет функциональность автозаполнения у элемента

    autocomplete("widget"): возвращает объект jQuery, представляющий виджет (var widget = $("#lang").autocomplete("widget");)

    autocomplete("option"): позволяет получить или установить значения свойств виджета. Например, установим и получим значение свойства collapsible:

    Var langs = ["Java", "JavaScript", "VisualBasic", "PHP", "Pascal"] ; $("input#lang").autocomplete({ source: langs}); $("input#lang").autocomplete("option", { autoFocus: true });

    autocomplete("search", "value"): производит поиск по списку так с учетом значения value. Например, метод $("#lang").autocomplete("search", "i"); будет эквивалентен действию ввода символа "i" в текстовое поле. И затем буду отображены все элементы списка, в которых присутствует символ "i"

События виджета

С помощью обработки следующих событий виджета мы можем произвести определенные действия в ответ на действия пользователя:

    change(event, ui) : событие возникает после изменения выбранного элемента.

    Параметр event содержит объект события, а параметр ui представляет объект, который содержит информацию о выбранном элементе:

    Var langs = ["Java", "JavaScript", "VisualBasic", "PHP", "Pascal"] ; $("input#lang").autocomplete({ source: langs}); $("input#lang").autocomplete({ change: function(event, ui) { console.log(ui.item.value); } });

    Используя свойство ui.item , мы получаем выбранный элемент. Элемент определен в виде объекта {label, value}, поэому, чтобы получить значение выбранного элемента, используем свойство value

    close(event, ui) : возникает при закрытии списка автозаполнения

    create(event, ui) : возникает при создании виджета

    focus(event, ui) : возникает при передаче фокуса элементу

    open(event, ui) : возникает при открытии или отображении списка автозаполнения

    response(event, ui) : возникает после завершения поиска, но перед тем, как список результатов автозаполнения появится на экране. Чтобы получить все результаты списка, надо использовать объект ui.content , который представляет массив:

    Var langs = ["Java", "JavaScript", "VisualBasic", "PHP", "Pascal"] ; $("input#lang").autocomplete({ source: langs}); $("input#lang").autocomplete({ response: function(event, ui) { for (var i = 0; i Selected location: {{ location }} import Autocomplete from "./Autocomplete.html" import { fetchLocations } from "./api.js" export default { data: () => ({ location: "" }), computed: { locations: location => { return location.length >= 3 ? fetchLocations(location) : } }, components: { Autocomplete } };
    Это некий родительский компонент, который реализует domain-логику конкретного кейса. В данном случае - это выбор локации (города).

    Сначала подключается компонент автодополнения, а также некий модуль, реализующий взаимодействие с серверным API. У нас также есть переменная «location», куда мы собственно сохраняем выбранное значение. Она биндится на «search» из компонента автокомплита через props, а также выводится неким результирующим значением чуть выше.

    Далее интересный момент. Так как Svelte поддерживает вывод асинхронных значений через {{#await /}}, а также вычисляемые свойства (computed props), которые могут зависеть от других данным, мы можем написать супер простое вычисляемое свойство для получения списка вариантов с сервера и подвязать его на изменение «location». Т.е. когда пользователь вводит значение в поле, реактивная переменная «location» изменяется, что приводит к пересчету вычисляемого свойства «locations». Данное свойство также биндится на «suggestions» из компонента автокомплита через props. И все работает как «магия»))))

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

    Вот так вот, супер просто можно реализовать переиспользуемый микро-компонент автодополнения на Svelte.

    Далее, так как к предыдущей статетье про Svelte было задано много вопросов, касающихся принципа работы Svelte, AoT-компиляции svelte-компонентов и вероятным дублированием кода. Представляю вольный перевод вот этого комментария создателя Svelte Рича Харриса (Rich Harris):

    Это хороший вопрос. Я бы ответил на него несколькими способами:
  • Часть кода переиспользуется между компонентами (например, такие методы как detachNode и др.) если мы компилируем код с помощью флага shared: true (что происходит автоматически при использовании интеграций с билд-тулзами, таких, как svelte-loader или rollup-plugin-svelte). В том случае, все эти штуки не дублируются, уменьшая накладные расходы.
  • Код генерируется так, чтобы быть более-менее удобочитаемым, но при этом иметь довольно не большой размер.
  • Тем не менее, в теории есть точка перехода, где размер генерируемого кода превышает размер фреймворка + шаблонов. Однако к тому времени, когда ваше приложение вырастет до такого размера вам скорее всего понадобиться использовать техники разделения кода (code-splitting). Например, подгружать компоненты асинхронно, на основании текущего URL. Методы разделения кода работают намного лучше со Svelte, чем с традиционными фреймворками, потому что традиционно, даже самый маленький кусок кода зависит от всей библиотеки.
  • Размер кода - это лишь одна их целей Svelte. Другими целями являются высокая производительность, обеспечение хорошего опыта для разработчиков (так как компилятор основан на статическом анализе кода, мы можем иметь полезные сообщения об ошибках и другие виды предупреждений, как в Elm). Также большой плюс такого подхода отсутствие необходимости говорить «нет» хорошим идеям новых фич для фреймворка, потому как появление новых возможностей никак не влияет на людей, которые их не используют. Традиционные фреймворки всегда вынуждены искать баланс между размерами фреймворка и потребностями его пользователей. И так далее.
  • В любом случае мы можем и будем уменьшать размер генерируемого кода, например с помощью более умной обработки пробелов или использования innerHTML в тех случаях, когда есть большой кусок статической разметки, который не имеет смысла генерировать программно. В итоге, размер генерируемого кода будет лишь уменьшаться с развитием компилятора.
  • Конечно же есть компромиссы, например, относительно Ractive - это гибкость. Мы не можем сделать this.observe("some.nested.property", () => {}) или использовать адапторы для сложных переменных, или иметь {{#with ...}} блоки в шаблонах и другие вещи. Все это имеет смысл в Ractive, который использует философию «делай что я имею ввиду». В то время как Svelte базируется на статическом анализе и больше на том что «делай что я говорю», что в конце концов это более строгий вариант.

    От себя хочу добавить, что еще не пробовал Svelte на более-менее крупном проекте (хотя и планирую). Также я не противопоставляю его таким гигантам как Angular или даже Vue. На том поле скорее играет Ractive, чем Svelte.

    Однако, считаю что он прекрасно занимает нишу небольших (виджеты и т.п.) и средних проектов (мобильные и ТВ приложения и т.п.). В таких проектах Svelte несомненно обеспечивает меньший размер бандла и большую скорость работы. Если для вас это актуально, вам стоит познакомиться с ним поближе.

    Всем хороших выходных! И да прибудет с вами Сила пятницы!

    UPDATE:
    Для тех, кто обеспокоен дублированием кода в Svelte. Есть новая информация непосредственно от Рича Харриса. Мой комментарий на эту тему можно прочитать

    В данном уроке мы рассмотрим один из новых компонентов jQuery UI 1.8 - виджет Autocomplete. Автозаполнение полей формы может быть очень полезной функцией для посетителей вашего сайта, так как она облегчает ввод информации. Такую функцию можно использовать, например, для поля, или при вводе страны, города, или чего либо подобного, что можно выбрать из общего списка. Виджет jQuery UI Autocomplete популярен у разработчиков, так как его легко использовать, он достаточно мощный и гибкий.

    Одним из свойств Facebook является отправка сообщений друзьям. Автозаполнение используется при вводе имени друга. В данном уроке мы будем использовать виджет jQuery UI Autocomplete для создания системы, подобной той, которая используется при отправке сообщений в Facebook. Конечно, отправку сообщения реализовывать не будем. Вот что должно получиться в итоге:

    Шаг 1 Getting Started

    Нужно построить пользовательскую загрузку jQuery UI, которая будет содержать только нужные компоненты. Переходим на страницу построения загрузки на http://jqueryui.com/download . Нам нужно использовать только следующие компоненты:

    • Widget
    • Position
    • Autocomplete

    Нужно использовать тему по умолчанию (UI Lightness) и убедиться в том, что выбрана версия 1.8 в колонке справа.

    Шаг 2 Разметка HTML

    Сначала посмотрим на :

    Новое сообщение Новое сообщение Кому: Тема: Сообщение: Отменить Отправить

    Это обычная стандартная форма. Внешний контейнер используется для задания стилей, а элемент , к которому будет присоединяться Autocomplete, также находится внутри элемента . Стиль для задается так, что он немного скрыт, а стиль придает ему вид, схожий с остальными полями формы. Контейнеру придается класс ui-helper-clearfix , чтобы использовать данный класс из CSS рабочей среды jQuery UI.

    Следующие файлы должны присоединяться в конце раздела :

    Шаг 3 Стили для формы

    Мы используем очень простую нейтральную тему в нашем примере. Следующий код CSS содержится в файле autocomplete.css (все стили jQuery UI устанавливаются в файле jquery-ui-1.8.custom.css ):

    #formWrap { padding:10px; position:absolute; float:left; background-color:#000; background:rgba(0,0,0,.5); -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px; } #messageForm { width:326px; border:1px solid #666; background-color:#eee; } #messageForm fieldset { padding:0; margin:0; position:relative; border:none; background-color:#eee; } #messageForm legend { visibility:hidden; height:0; } #messageForm span { display:block; width:326px; padding:10px 0; margin:0 0 20px; text-indent:20px; background-color:#bbb; border-bottom:1px solid #333; font:18px Georgia, Serif; color:#fff; } #friends { width:274px; padding:3px 3px 0; margin:0 auto; border:1px solid #aaa; background-color:#fff; cursor:text; } #messageForm #to { width:30px; margin:0 0 2px 0; padding:0 0 3px; position:relative; top:0; float:left; border:none; } #messageForm input, #messageForm textarea { display:block; width:274px; padding:3px; margin:0 auto 20px; border:1px solid #aaa; } #messageForm label { display:block; margin:20px 0 3px; text-indent:22px; font:bold 11px Verdana, Sans-serif; color:#666; } #messageForm #toLabel { margin-top:0; } #messageForm button { float:right; margin:0 0 20px 0; } #messageForm #cancel { margin-right:20px; } #friends span { display:block; margin:0 3px 3px 0; padding:3px 20px 4px 8px; position:relative; float:left; background-color:#eee; border:1px solid #333; -moz-border-radius:7px; -webkit-border-radius:7px; border-radius:7px; color:#333; font:normal 11px Verdana, Sans-serif; } #friends span a { position:absolute; right:8px; top:2px; color:#666; font:bold 12px Verdana, Sans-serif; text-decoration:none; } #friends span a:hover { color:#ff0000; } .ui-menu .ui-menu-item { white-space:nowrap; padding:0 10px 0 0; }

    Для придания форме чудесных прозрачных границ с закругленными углами используется правила CSS3 rgba , -moz-border-radius , -webkit-border-radius и border-radius . IE не поддерживает ни одного их данных правил, и, хотя можно использовать фильтр для воспроизведения зачатка прозрачности, скругленные углы можно сделать только с использованием изображений. Эффективность прозрачности RGBa не проявляется в данном примере в полной силе. Вероятно, что данный тип формы будет использоваться как плавающее модальное окно поверх контента страницы.

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

    Также мы задаем стиль для имени получателя, которое будет добавляться к , как элемент , содержащий ссылку. В основном стиль соответствует теме и имеет также скругленные углы. Важно, что данные элементы имеют блочную структуру и плавают, так что они заполняются правильно. Также нужно переписать некоторые стили Automcomplete, задаваемые в используемой теме jQuery UI.

    Форма должна иметь следующий вид:

    Шаг 4 Присоединяем Autocomplete

    Теперь нужно присоединить виджет Autocomplete к внутри . Для этого используется следующий скрипт:

    $(function(){ //Присоединяем автозаполнение $("#to").autocomplete({ //Определяем обратный вызов к результатам форматирования source: function(req, add){ //Передаём запрос на сервер $.getJSON("friends.php?callback=?", req, function(data) { //Создаем массив для объектов ответа var suggestions = ; //Обрабатываем ответ $.each(data, function(i, val){ suggestions.push(val.name); }); //Передаем массив обратному вызову add(suggestions); }); }, //Определяем обработчик селектора select: function(e, ui) { //Создаем форматированную переменную friend var friend = ui.item.value, span = $("").text(friend), a = $("").addClass("remove").attr({ href: "javascript:", title: "Remove " + friend }).text("x").appendTo(span); //Добавляем friend к div friend span.insertBefore("#to"); }, //Определяем обработчик выбора change: function() { //Сохраняем поле "Кому" без изменений и в правильной позиции $("#to").val("").css("top", 2); } }); });

    Виджет присоединяется к с помощью метода autocomplete() . объект передается литерально как аргумент метода, который конфигурирует опцию source и возвратные функции событий select и change .

    Опция source используется для указания источника предложения для меню Autocomplete. Мы используем функцию, как значение для данной опции, которая принимает два аргумента. Первый является термином, введенным в , а второй - возвратной функцией, которая используется для передачи предложений обратно виджету.

    В данной функции мы используем метод jQuery getJSON() для передачи термина в PHP файл на стороне сервера. Файл PHP использует термин для извлечения похожих имен контакта из базы данных MySql. Мы используем JSONP для возвращения полученных данных обратно процессу. Возвратная функция, которая передается как второй аргумент опции source, предполагает получение данных в массиве. Таким образом нужно создать пустой массив и использовать метод jQuery each() для обработки каждого пункта массива JSON, который возвращается сервером. Итерация совершается над каждым пунктом в массиве и добавляет каждое предложение в новый массив. Как только новый массив будет построен, мы передаем его возвратной функции для вывода виджетом в меню.

    Затем определяется обработчик для события select Autocomplete. Данная функция выполняется виджетом каждый раз, когда предложение выделяется в меню Autocomplete. Данная функция автоматически получает два аргумента - объект события и объект ui, который содержит выбранное предложение. Мы используем данную функцию для форматирования имени получателя и добавления его в . Просто создается элемент для текста и элемента ссылки, которая используется для удаления получателя. Как только форматированное имя получателя будет создано, оно вставляется прямо перед закамуфлированным .

    Затем мы добавляем обработчик события change. Данная функция будет вызвана при изменениях значения , с которым ассоциирован Autocomplete. Мы просто удаляем значение из , потому что мы уже добавляли форматированную версию в контейнер .

    Это вся конфигурация, которая нужна для конкретного применения, но есть еще пара функций, которые нужны для придания аккуратности коду. После метода autocomplete() добавим следующий код:

    //Добавляем обработчки события click для div friends $("#friends").click(function(){ //Фокусируемся на поле "Кому" $("#to").focus(); }); //Добавляем обработчик для события click удаленным ссылкам $(".remove", document.getElementById("friends")).live("click", function(){ //Удаляем текущее поле $(this).parent().remove(); //Корректируем положение поля "Кому" if($("#friends span").length === 0) { $("#to").css("top", 0); } });

    , к которому прикреплен наш Autocomplete, практически скрыт и контейнер имеет стиль, который делает его похожим на другие поля формы. Для завершения обмана мы добавляем обработчик события click контейнеру , таким образом нажатие клавиши мыши где-угодно на нем фокусирует действительный . Теперь визуально и функционально не отличается от обычного поля.

    Также нужно обрабатывать событие click на ссылке, которая добавляется для каждого форматированного имени получателя. Мы используем метод jQuery live() потому, что данный элемент может и не существовать на странице в заданное время, и такой подход проще, чем привязывание функции обработчика каждый раз, когда создается ссылка. Когда бы не была нажат ссылка, все что нужно сделать, это перейти к родителю ссылки и затем удалить ее со страницы. Нужно проверить, удалены ли все имена получателей, и если это так, то сбросить положение к значению по умолчанию.

    Шаг 5 Дополнительный код и ресурсы

    Для хранения списка всех имен получателей используется база данных MySql. Следующий файл PHP получает данные, отправленные методом getJSON() и вытаскивает соответствующие имена получателей из базы данных:

    Для запуска примера нужен веб сервер с установленным и сконфигурированным PHP, а также сервер MySql и соответствующая база данных и таблица. Когда символ вводится в поле ‘Кому’, он передается на сревер и используется для вытаскивания из базы данных каждого имени, которое начинается с введенного символа. Подходящие имена затем передаются обратно на страницу и выводятся в меню предложений:

    Заключение

    Наша форма в действительности ничего никуда не отправляет. Функционал легко реализовать с помощью обработки события, привязанного к кнопке "Отправить".

    Виджет jQuery UI Autocomplete делает простым соединение с любым источником данных и содержит богатый функционал для обработки событий, которые мы можем использовать для того, чтобы реагировать на ввод текста в ассоциированное поле или выбор предложения из меню. Виджет стилизуется с использованием рабочей среды CSS jQuery UI и может легко быть настроен на то, чтобы соответствовать теме сайта. В целом, описанный виджет очень легок в использовании и обеспечивает отличный функционал.

    Ну вот и готова предрелизная версия mSearch2. Мы должны ее дружно потетстировать, поправить баги и получится стабильная версия.

    В принципе, теперь я воплотил все свои (и не только свои) хотелки. У нас добавилось управление словарями прямо в вдминке и автодополнение.

    Со словарями всё просто - при установке дополнения сразу загружаются 2 словаря: русский и английский. Если вам нужно добавить или удалить словарь, для этого появился новый раздел в админке.
    В индексации участвуют все установленные словари, ничего настраивать не нужно. При загрузке словаря вы можете выбрать зеркало SourceForge, чтобы качать с ближайшего к вам сервера.

    АвтодополнениеЭту штуку просят сделать уже давно, но так как она весьма непростая, реализация затянулась. Фокус в том, что автозаполнение на готовом сайте «для себя» сделать нетрудно, а вот написать универсально, чтобы вы могли показывать и категории, и запросы, и товары с картинками - это заморочка.

    Но все вопросы решены и теперь у нас есть новый сниппет mSearchForm . Вот его параметры:

    • &pageId - id страницы, на которую будет отправлен юзер в месте с запросом. Если не указано - это будет текущая страница.
    • &tplForm - чанк с фомой для вывода. У тега form обязательно должен быть указан класс msearch2 .
    • &tpl - Оформление строчек автодополнения.
    • &autocomplete - Настройка автоподсказок. Доступно 3 варианта: results (по умолчанию, поиск по сайту), queries (поиск по запросам) и 0 - отключить.
    • &limit - Ограничение выборки строк автодополнения.
    • &element - Какой сниппет оформляет результаты. Это актуально только для режима results .
    Итак, у нас есть 2 варианта работы autocomplete: поиск по сайту и поиск по запросам.

    Первый самый интересный - он ищет точно так же как и сниппет mSearch2, получает id совпадений и передаёт их в указанный сниппет. А сниппет может быть любым, главное, чтобы он понимал параметр &resources .

    Заодно сниппету будут переданы все параметры, указанные при вызове mSearchForm - очень похоже на работу mFilter2 с пагинатором.

    Таким образом, вы можете указать чанки, подключение ТВ, таблиц, картинок товаров и чего угодно. Так как этот режим сразу выводит точное совпадение, при выборе результата вы отправитесь на конечную страницу - вам нечего искать, вы уже нашли.

    Понятно, можно не кликать, а жать enter и будет поиск по тому, что вы набрали, без подсказок. Конечно, все теги в чанках выполняются. Например, мне очень нравится вызывать в них pdoCrumbs .

    А второй режим попроще - он просто смотрит таблицу запросов, которая появилась в прошлой версии, и выводит совпадения из неё. Выводит, понятно, только те, что с результатами. Потому, что от дополнения «ккккувпусм» толку никакого не будет (вы бы видели, что у меня на сайте ищут).

    Само дополнение работает на

    a! Представляю Вам очередную статью в рубрике «Плагины». Рассмотрим плагин jQuery-Autocomplete , с помощью которого легко создать автозаполнение текстовых полей формы. Работает только на jQuery, для хранение значений автозаполнения можно использовать текстовый файл.

    HTML разметка

    У поля к которому следуют прикрепить автозаполнение, должен быть атрибут id , именно по нему будет идти привязка:

    Использование

    Теперь вызываем метод .autocomplete :

    В приведенном примере метод .autocomplete вызывается с 2мя параметрами, lookup где
    countriesArray — это массив со странами, о нем и как он формируется немного ниже, а также onSelect — функция обратного вызова при выборе элемента из предложенного списка.

    Параметры
    • serviceUrl — путь до файла с значениями.
    • lookup — массив значений. Это может быть массив строк или:
      • suggestion — литерал объекта в формате { value: ‘string’, data: any }
    • lookupFilter — function (suggestion, query, queryLowerCase) {} Функция фильтрации для поиска в массиве. По умолчанию частичное совпадение строк (без учета регистра);
    • onSelect — Callback функция, вызывается когда пользователь выбирает значение из предложенного списка;
    • minChars — Минимальное количество символов, необходимых для запуска автозаполнения. По умолчанию: 1;
    • maxHeight — Максимальная высота контейнера со списком значений, в пикселях. По умолчанию: 300;
    • deferRequestBy — Количество миллисекунд задержки AJAX запроса. По умолчанию: 0;
    • width — Ширина контейнера со списком значений автозаполнения в пикселях, например: 300. По умолчанию: auto;
    • params — Дополнительные параметры, передаваемые с запросом, необязательно.
    • formatResult — function (suggestion, currentValue) {} пользовательские функции, необязательно.
    • delimiter — Строка или RegExp, который разбивает входное значение. Полезно когда, например, вам нужно заполнить список значений, разделенных запятыми;
    • zIndex — свойство css zIndex для контейнера со списком предложений. По умолчанию: 9999;
    • type — тип Ajax запроса. По умолчанию: GET ;
    • noCache — Логическое значение, указывающее, следует ли кэшировать результаты списка предложений. По умолчанию True.
    • onSearchStart — function (query) {} вызывается перед запроса AJAX. this связано с input элементом;
    • onSearchComplete — function (query) {} вызывается после запроса AJAX. this связано с input элементом;
    • tabDisabled — по-умолчанию false . Устанавливает курсор ввода после выбора предложенного значения;
    • paramName — по-умолчанию query . Имя параметра запроса, который содержит запрос;
    • transformResult — function(response) {} Вызывается после того, как станет готов результат запроса. Преобразует результат в response.suggestions формат;
    • autoSelectFirst — если установлено true , первый пункт будет подсвечен при показе списка предложений. Значение по-умолчанию false ;
    • appendTo — контейнер, в который будет добавлен список предложений. По-умолчанию body . Может быть JQuery объект, селектор или HTML элемент. Убедитесь в том, чтобы было установлено position: absolute или position: relative для этого элемента.
    Массив со списком значений выбора

    Теперь о массиве со списком значений выбора. Как писалось в начале это также может быть отдельный текстовый файл, с соответствующей структурой. Вот так выглядит массив:

    1
    2
    3
    4
    5

    var countriesArray = [
    { value: "Andorra" , data: "AD" } ,
    // ...
    { value: "Zimbabwe" , data: "ZZ" }
    ] ;

    1
    2
    3
    4
    5
    6
    7

    // Подгружаем страны из текстового файла:
    $.ajax ({
    url: "content/countries.txt" ,
    dataType: "json"
    } ) .done (function (source) {

    var countriesArray = $.map (source, function (value, key) { return { value: value, data: key } ; } ) ;

    Где с помощью метода $.map переводим все элементы массива из файла в новый массив со значениями.

    Оформление

    Структура списка предложений выглядит так:

    1
    2
    3
    4
    5


    ...
    ...
    ...

    И применяется простое оформление.

  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то