JQuery Autocomplete: автозаполнение. Виджет Autocomplete. Автозаполнение

  • 09.06.2019

Автозаполнение форм - это функция, которая позволяет автоматически вводить в формах на сайтах личную информацию, например ваше имя, адрес, электронную почту или телефон. По умолчанию в Яндекс.Браузере автозаполнение включено .

Автозаполнение удобно, но, чтобы подставить ваши данные в формы, браузеру нужно хранить их на компьютере. Если на компьютер проникнет вредоносное ПО, злоумышленник может украсть ваши данные. А если во время вашего отсутствия посторонний человек откроет браузер, он сможет авторизоваться на сайтах под вашим именем или узнать ваши данные другим способом. Поэтому, если для вас безопасность ваших данных намного важнее удобства, возможно, вам стоит отключить автозаполнение.

  • Удалить данные автозаполнения
  • Отключить автозаполнение форм
  • Сохранять данные автозаполнения автоматически

    Внимание. Если вы хотите, чтобы данные автозаполнения на конкретном сайте не сохранялись в браузере, используйте режим Инкогнито . При необходимости вы можете отключить автозаполнение форм в браузере.

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

    Задать данные автозаполнения вручную Удалить данные автозаполнения Отключить автозаполнение форм Автозаполнение поискового запроса

    Запросы в «Умной строке» браузера

    По умолчанию в браузере сохраняется история запросов. При повторном вводе они выделяются точкой справа.

    ","hasTopCallout":true,"hasBottomCallout":false,"areas":[{"shape":"circle","direction":["top","right"],"alt":"Сохраненный поисковой запрос","coords":,"isNumeric":false,"hasTopCallout":true,"hasBottomCallout":false}]}}\">

    Чтобы удалить сохраненные в браузере поисковые запросы:

    Запросы в поисковой строке Яндекса

    Если вы авторизованы в Яндексе, то ваши запросы сохраняются по умолчанию – при повторном вводе они будут выделены фиолетовым. Кроме этого, сайты, на которые вы часто заходите, отображаются первыми в списке поисковых подсказок.

    Ну вот и готова предрелизная версия 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 .

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

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

    В данном уроке мы рассмотрим один из новых компонентов 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 и может легко быть настроен на то, чтобы соответствовать теме сайта. В целом, описанный виджет очень легок в использовании и обеспечивает отличный функционал.

    Виджет Autocomplete

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

    Создание виджета Autocomplete

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

    jQuery UI $(function() { var flowers = ["Астра", "Нарцисс", "Роза", "Пион", "Примула", "Подснежник", "Мак", "Первоцвет", "Петуния", "Фиалка"]; $("#acInput").autocomplete({ source: flowers }) }); Выберите название цветка:

    Метод autocomplete() работает аналогично любому другому методу jQuery UI из тех, с которыми вы уже познакомились, за исключением того, что ему необходимо передавать объект отображения, содержащий значение опции source. Эта опция позволяет указать источник, из которого должны извлекаться данные для автозаполнения. В примере роль такого источника играет простой массив значений.

    На рисунках ниже показано, в каком виде средство автозаполнения предстает перед пользователем:

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

    После ввода второй буквы ("к") список сокращается до одного названия (Мак), содержащего введенное сочетание букв ("ак"). Виджет Autocomplete не проверяет правильность введенных данных, и пользователь может вводить в текстовом поле любые значения, а не только те, которые определены опцией source.

    Заметьте, что никаких специальных мер по сортировке массива, указанного с помощью опции source, мы не предпринимали. За нас это автоматически сделала библиотека jQuery UI. Кроме того, как будет показано далее, возможные варианты продолжения ввода могут поступать из нескольких источников.

    В приведенном примере документа элементы input и label помещены в элемент div, которому присвоен класс ui-widget. Тем самым обеспечивается совпадение CSS-свойств шрифтов, используемых в этих элементах и в раскрывающемся списке виджета Autocomplete.

    Использование массива объектов в качестве источника данных

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

    $(function() { var flowers = [{label: "Астры (бордовые)", value: "Астры"}, {label: "Нарциссы(белые)", value: "Нарциссы"}, {label: "Розы (розовые)", value: "Розы"}, {label: "Пионы (розовые)", value: "Пионы"}] $("#acInput").autocomplete({ source: flowers }) });

    Когда используется массив объектов, средство автозаполнения ищет свойства label и value. Свойство label используется для создания ярлыков, отображаемых в раскрывающемся списке, а свойство value - для вставки значений в поле ввода при выборе соответствующего ярлыка. В данном случае ярлыки содержат информацию об оттенках цветов, которая не включается в значения. Результат приведен на рисунке:

    Настройка виджета Autocomplete

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

    Свойства виджета Autocomplete Свойство Описание
    appendTo Определяет элемент, к которому должен быть присоединен раскрывающийся список элементов автозаполнения. По умолчанию таковым является элемент body
    autoFocus Если эта опция равна true, то фокус автоматически устанавливается на первом элементе раскрывающегося списка, что позволяет выбирать его простым нажатием клавиши . Значение по умолчанию - false
    delay Устанавливает длительность периода задержки (в миллисекундах) после нажатия клавиши, по истечении которого будет срабатывать автозаполнение. Значение по умолчанию - 300
    disabled Установка значения true приводит к отключению средства автозаполнения. На базовый элемент input эта опция никакого влияния не оказывает. Значение по умолчанию - false
    minLength Определяет минимальное число символов, ввод которых будет инициировать отображение раскрывающегося списка элементов автозаполнения. Значение по умолчанию - 1
    source Устанавливает источник данных для добавления в раскрывающийся список элементов автозаполнения. Значения по умолчанию для этого свойства не существует, и поэтому указание необходимого значения при вызове метода autocomplete() является обязательным
    Использование дистанционного источника данных

    Из всех настроек виджета Autocomplete наибольший интерес представляет опция source, поскольку она обеспечивает возможность выбора самых различных источников данных для включения в раскрывающийся список элементов автозаполнения. С ролью простых статических списков отлично справляются массивы JavaScript, которые использовались в предыдущем примере. В более сложных ситуациях необходимые данные могут поступать с сервера. Для этого потребуется лишь указать URL-адрес источника данных, как показано в примере ниже:

    $(function() { $("#acInput").autocomplete({ source: "phphandler.php" }) });

    Как только средству автозаполнения понадобятся данные, jQuery UI выполнит HTTP-запрос по указанному URL-адресу, используя метод GET. Введенные к этому времени пользователем символы включаются в строку запроса с помощью ключевого слова term . Например, если пользователь введет букву "a", то jQuery UI направит следующий запрос:

    http://localhost/phphandler.php?term=a

    http://localhost/phphandler.php?term=ac

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

    За получение значения term из строки запроса и возврат JSON-строки, представляющей массив элементов, отображаемых для пользователя, отвечает сервер. Простой серверный сценарий PHP, пригодный для этих целей, приведен ниже:

    В этом сценарии используется тот же набор названий цветов, что и в предыдущем примере, и возвращаются значения, которые соответствуют поисковому выражению, определяемому ключевым словом term запроса, полученного от браузера. Я незначительно изменил процедуру поиска таким образом, чтобы возвращались лишь те названия цветов, которые начинаются с поискового термина. Так, если jQuery UI отправляет строку запроса http://localhost/phphandler.php?term=a то сервер возвращает следующие данные JSON: ["Астры"] .

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

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

    Имеется возможность управлять частотой отправки запросов средством автозаполнения с помощью опций minLength и delay. Опция minLength позволяет указать минимальное количество символов, которые пользователь должен ввести, прежде чем jQuery UI направит соответствующий запрос серверу. Таким образом, к моменту отправки запроса пользователем уже будет введено несколько символов, и этой информации вам будет вполне достаточно, чтобы сузить область поиска.

    С помощью опции delay можно указать время, которое должно пройти с момента ввода символа, прежде чем будет сделан запрос. Это позволяет избежать неоправданно частой отправки запросов при высокой скорости набора символов пользователем. Так, если пользователь введет буквы "a" и "c", то будет направлен только один запрос, соответствующий комбинации "ac", а не два мгновенно следующих один за другим отдельных запроса, соответствующих наборам букв "a" и "ac".

    Совместно используя обе опции, можно уменьшить количество запросов и при этом по-прежнему предоставлять пользователю достаточный объем необходимой информации. Пример использования описанных опций настройки приведен ниже:

    $(function() { $("#acInput").autocomplete({ source: "phphandler.php", minLength: 3, delay: 1000 }) });

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

    Использование функции в качестве источника данных

    Для создания источника элементов автозаполнения, в полной мере приспособленного к конкретным потребностям пользователей, можно использовать функцию. Эта функция также указывается с помощью опции source и вызывается всякий раз, когда средство автозаполнения должно отображать возможные варианты продолжения ввода для пользователей. Соответствующий пример приведен ниже:

    $(function() { var flowers = ["Астра", "Нарцисс", "Роза", "Пион", "Примула", "Подснежник", "Мак", "Первоцвет", "Петуния", "Фиалка"]; $("#acInput").autocomplete({ source: function(request, response) { var term = request.term; var pattern = new RegExp("^" + term, "i"); var results = $.map(flowers, function(elem) { if (pattern.test(elem)) { return elem; } }) response(results); } }) });

    Мы передаем этой функции два аргумента. Один из них - это объект с единственным свойством term. Значением этого свойства является строка символов, введенных пользователем. Второй аргумент - это функция, которая вызывается, когда уже сгенерирован список элементов автозаполнения для отображения пользователю. Аргументом этой функции является массив строк или объектов.

    В данном случае мы воспроизводим функциональность, которая использовалась на стороне сервера в предыдущем примере, и генерируем массив, включающий лишь те элементы автозаполнения, которые начинаются с заданного выражения. Далее результаты передаются обратно jQuery UI путем передачи массива функции response() в качестве аргумента.

    Данный способ обработки результатов не совсем обычен, но работает вполне удовлетворительно, и генерируемые элементы отображаются для пользователя, так что конечный результат получается тем же, что и в случае применения серверного сценария PHP.

    Использование методов виджета Autocomplete

    Виджет Autocomplete поддерживает ряд методов, которые можно использовать для управления процессом автозаполнения. Эти методы перечислены в таблице ниже:

    Методы виджета Autocomplete Метод Описание
    autocomplete("close") Закрывает раскрывающийся список элементов автозаполнения
    autocomplete("destroy") Полностью удаляет функциональность автозаполнения из элемента input
    autocomplete("disable") Приостанавливает работу виджета Autocomplete для базового элемента
    autocomplete("enable") Возобновляет работу ранее приостановленного виджета Autocomplete
    autocomplete("option") Устанавливает значения одного или нескольких свойств
    autocomplete("search", значение) Запускает процедуру поиска элементов автозаполнения, соответствующих указанному значению. Если аргумент значение не предоставлен, используется содержимое элемента input

    Специфичными для средства автозаполнения являются два метода - search и close. Их можно использовать для программного запуска и остановки процесса автозаполнения, как показано в примере ниже:

    ... $(function() { var flowers = ["Астра", "Нарцисс", "Роза", "Пион", "Примула", "Подснежник", "Мак", "Первоцвет", "Петуния", "Фиалка"]; $("#acInput").autocomplete({ source: flowers, minLength: 0, delay: 0 }) $("button").click(function(e) { e.preventDefault(); switch (this.id) { case "close": $("#acInput").autocomplete("close"); break; case "input": $("#acInput").autocomplete("search"); break; default: $("#acInput").autocomplete("search", this.id); break; } }) }); п с Содержимое вывода Закрыть Выберите название цветка:

    В этом примере мы добавили некоторые кнопки и использовали метод click() для настройки различных вызовов метода autocomplete(). При нажатии кнопок, обозначенных как "П" и "С", вызывается метод search, которому выбранная буква передается в качестве поискового выражения. Это приводит к запуску средства автозаполнения с использованием выбранной буквы, независимо от содержимого текстового поля, как показано на рисунке:

    Как показано на рисунке, в раскрывающемся списке отображаются элементы, которые содержат букву, указанную на нажатой кнопке.

    Кнопка "Содержимое ввода" запускает средство автозаполнения с использованием тех символов, которые содержатся в текстовом поле. При настройке средства автозаполнения свойству minLength было присвоено значение 0, в результате чего после щелчка на кнопке "Содержимое ввода" в списке ввода отображаются сразу все элементы автозаполнения, как показано на рисунке ниже. Если пользователь введет какие-либо символы в поле ввода, то отобразятся лишь элементы, содержащие введенную строку:

    Использование событий виджета Autocomplete

    С виджетом Autocomplete связан ряд событий, которые перечислены в таблице ниже:

    События виджета Autocomplete Событие Описание
    change Происходит, когда фокус ввода выходит за пределы текстового поля после изменения содержащегося в нем значения
    close Происходит при закрытии раскрывающегося списка элементов автозаполнения
    create Происходит при инициализации экземпляра виджета Autocomplete для данного элемента
    focus Происходит, когда элемент автозаполнения получает фокус в раскрывающемся списке
    open Происходит при открытии раскрывающегося списка элементов автозаполнения
    search Происходит перед генерацией раскрывающегося списка элементов автозаполнения или перед поиском в нем подходящих элементов
    select Происходит при выборе элемента списка автозаполнения

    В jQuery UI можно получить дополнительную информацию о событии с помощью второго аргумента функции-обработчика, обычно обозначаемого как ui. В случае событий change, focus и select jQuery UI наделяет объект ui свойством item, возвращающим объект, который описывает выбранный или получивший фокус элемент раскрывающегося списка. Пример, в котором демонстрируется использование этой возможности для получения информации о выбранном элементе, приведен ниже:

    ... $(function() { var flowers = ["Астра", "Нарцисс", "Роза", "Пион", "Примула", "Подснежник", "Мак", "Первоцвет", "Петуния", "Фиалка"]; $("#acInput").autocomplete({ source: flowers, focus: displayItem, select: displayItem, change: displayItem }) function displayItem(event, ui) { $("#itemLabel").text(ui.item.label) } }); Выберите название цветка: Значение элемента:

    В этом примере добавлен элемент span, который используется для отображения свойства label выбранного объекта. Объекты со свойствами label и value создаются jQuery UI даже тогда, когда вы задаете в опции source простой массив строк, поэтому одно из этих свойств объекта ui.item вам всегда приходится считывать. В данном примере для событий focus, select и change используется одна и та же функция, отображающая значение элемента. Результат представлен на рисунке:

    Замена действия по умолчанию для события select

    Для события select предусмотрено действие по умолчанию, которое заключается в замене содержимого элемента input содержимым свойства value элемента, выбранного в раскрывающемся списке. Это как раз то, что необходимо в большинстве случаев, но можно использовать данное событие и для того, чтобы либо дополнить действие по умолчанию, либо полностью отменить его и выполнить какие-то другие действия, которые вам нужны.

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

    ... $(function() { var flowers = ["Астра", "Нарцисс", "Роза"]; var skus = {Астра: 100, Нарцисс: 101, Роза: 102}; $("#acInput").autocomplete({ source: flowers, select: function(event, ui) { $("#sku").val(skus); } }) }); Выберите название цветка: Отдел склада:

    Когда происходит событие select, функция-обработчик использует аргумент ui для получения значения выбранного элемента и установки значения связанного поля, в данном случае - поля "Отдел склада", которое получается из объекта skus. Тем самым мы можем помогать пользователям, предоставляя значения по умолчанию для других полей на основе первоначального выбора.

    Это может пригодиться во множестве ситуаций, особенно при выборе таких элементов, как адреса доставки. Результаты представлены на рисунке ниже:

    Если Вы пробовали что-то найти в, то наверняка знаете, что после ввода символа в текстовое поле появляется выпадающий список, который содержит десяток строк со словами, начальные символы которых совпадают с теми символами, что Вы уже успели ввести. Так работает Google Suggest. Почему бы не сделать так же на своем сайте? Ведь это удобно. К тому же с библиотекой jQuery это не так уж и сложно…

    Как обычно, для начала я приведу пример, а потом мы будем разбирать, как он работает.

    Поскольку это всего лишь пример, поясню, что в левом текстовом поле доступен выбор российских городов, которые начинаются на букву «М», а в правом – список поселков городского типа (пгт) с численностью населения более 10 тыс. жителей (по данным Всероссийской переписи населения на 9 октября 2002 года).

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

    Вы можете скачать исходный код примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.

    Сначала потребуется только подключить библиотеку и файл query.autocomplete.js в разделе HEAD нужной страницы.

    Если скачаете пример, то легко сможете разобраться и в стилевом оформлении. Учтите, что файл jquery.autocomplete.js использует имена классов (начинаются с ac_), но если Вы захотите по каким-то причинам изменить эти имена – это тоже можно будет довольно легко сделать.

    Что касается HTML-кода, то естественно нужно описать поле для ввода текста:

    А вот использовать jquery.autocomplete.js можно двумя разными способами.

    Способ первый:
    Если объем данных не очень большой, и данные не будут изменяться, то их можно поместить непосредственно на странице, как и сделано в примере в текстовом поле слева.

    $(document).ready(function(){ $("#example").autocompleteArray([ "Магадан", "Магас", "Магнитогорск", "Майкоп", ........ "Муром", "Мценск", "Мыски", "Мытищи", "Мышкин" ], { delay:10, minChars:1, matchSubset:1, autoFill:true, maxItemsToShow:10 }); });

    Способ второй:
    Если данные большого объема, и/или часто изменяются, то необходимо предусмотреть обработку этих данных на сервере (для примера выбран PHP). jquery.autocomplete.js предусматривает отправку GET-запроса с параметром q , значением которого являются введенные символы. Именно так в примере работает текстовое поле справа.

    $(document).ready(function(){ $("#example2").autocomplete("autocomplete.php", { delay:10, minChars:2, matchSubset:1, autoFill:true, matchContains:1, cacheLength:10, selectFirst:true, formatItem:liFormat, maxItemsToShow:10, onItemSelect:selectItem }); });

    В этих примерах, помимо данных (в первом случае) и URL обработчика (во втором случае) мы передаем некоторые опции. Список опций приведен ниже:

    autoFill – когда Вы начинаете вводить текст, в поле ввода будет подставлено (и выделено) первое подходящее значение из списка. Если Вы продолжаете вводить текст, в поле ввода и далее будет подставляться подходящее значение, но уже с учетом введенного Вами текста. (По умолчанию: false).

    inputClass – этот класс будет добавлен к элементу ввода. (По умолчанию: «ac_input»).

    resultsClass – класс для UL, который будет содержать элементы результата (элементы LI). (По умолчанию: «ac_results»).

    – класс для элемента ввода, в то время, когда происходит обработка данных на сервере. (По умолчанию: «ac_loading»).

    lineSeparator – символ, который разделяет строки в данных, возвращаемых сервером. (По умолчанию: «\n»).

    cellSeparator – символ, который разделяет «ячейки» в строках данных, возвращаемых сервером. (По умолчанию: «|»).

    minChars – минимальное число символов, которое пользователь должен напечатать перед тем, как будет активизирван запрос. (По умолчанию: 1).

    delay – задержка в миллисекундах. Если в течение этого времени пользователь не нажимал клавиши, активизируется запрос. Если используется локальный запрос (к данным, находящимся непосредственно в файле), задержку можно сильно уменьшить. Например до 40ms. (По умолчанию: 400).

    cacheLength – число ответов от сервера, сохраняемых в кэше. Если установлено в 1 – кэширование данных отключено. Никогда не устанавливайте меньше единицы. (По умолчанию: 1).

    matchSubset – использовать ли кэш для уточнения запросов. Использование этой опции может сильно снизить нагрузку на сервер и увеличить производительность. Не забудьте при этом еще и установить для cacheLength значение побольше. Например 10. (По умолчанию: 1).

    matchCase – использовать ли сравнение чувствительное к регистру символов (только если Вы используете кэширование). (По умолчанию: 0).

    maxItemsToShow – ограничивает число результатов, которые будут показаны в выпадающем списке. Если набор данных содержит сотни элементов, может быть неудобно показывать весь список пользователю. Рекомендованное значение 10. (По умолчанию: -1).

    extraParams – дополнительные параметры, которые могут быть переданы на сервер. Если Вы напишете {page:4}, то строка запроса к обработчику на сервере будет сформирована следующим образом: my_handler.php?q=foo&page=4 (По умолчанию: {}).

    width – устанавливает ширину выпадающего списка. По умолчанию ширина выпадающего списка определена шириной элемента ввода. Однако, если ширина элемента ввода небольшая, а строки выпадающего списка содержат большое количество символов – эта опция вполне может пригодиться. (По умолчанию: 0).

    selectFirst – если установить в true , то по нажатию клавиши Tab или Enter будет выбрано то значение, которое в данный момент установлено в элементе ввода. Если же имеется выбранный вручную («подсвеченный») результат из выпадающего списка, то будет выбран именно он. (По умолчанию: false).

    selectOnly – если установить в true и в выпадающем списке только одно значение, оно будет выбрано по нажатию клавиши Tab или Enter, даже если этот пункт не был выбран пользователем с помощью клавиатуры или указателя мыши. Заметьте, что эта опция отменяет действие опции selectFirst . (По умолчанию: false).

    formatItem – JavaScript функция, которая поможет обеспечить дополнительную разметку элементов выпадающего списка. Функция будет вызываться для каждого элемента LI . Возвращаемые от сервера данные могут быть отображены в элементах LI выпадающего списка (см. второй пример). Принимает три параметра: строка результата, позиция строки в списке результатов, общее число элементов в списке результатов. (По умолчанию: none).

    onItemSelect – JavaScript функция, которая будет вызвана, когда элемент списка выбран. Принимает единственный параметр – выбранный элемент LI . Выбранный элемент будет иметь дополнительный атрибут «extra», значением которого будет являться массив всех ячеек строки, которая была получена в качестве ответа от сервера. (По умолчанию: none).

    Последние две опции весьма важны, если Вы хотите сделать действительно удобный и полезный элемент интерфейса, поэтому приведу примеры.

    Function liFormat (row, i, num) { var result = row + "" + row + " тыс.чел."; return result; }

    В опции formatItem мы определили имя вызываемой функции – liFormat , а сама функция просто формирует строку, которая будет вставлена в соответствующий элемент LI . Строка содержит название поселка и элемент em , в который выводится количество проживающих там, в тысячах человек. Элемент em имеет класс qnt , с помощью которого, используя CSS , мы сдвигаем этот элемент вправо, немного уменьшаем размер шрифта и делаем сам шрифт зеленого цвета.

    Следующий пример для опции onItemSelect :

    Function selectItem(li) { if(li == null) var sValue = "Ничего не выбрано!"; if(!!li.extra) var sValue = li.extra; else var sValue = li.selectValue; alert("Выбрана запись с ID: " + sValue); }

    Здесь видно как можно работать со значениями атрибута «extra» выбранного элемента LI . В примере мы выводим в alert значение идентификатора для записи из нашей тестовой базы.

    Нам осталось только разобрать те действия, которые будут выполняться на стороне сервера. Как Вы наверное помните, мы выбрали для этого PHP . Вспомним также, что на сервер передается GET-запрос с параметром q , содержащим уже введенные пользователем символы. Сам код Вы сможете посмотреть, скачав файл примера.

    Весь код мы будем выполнять только в случае существования XMLHttpRequest , только если передан GET-запрос с параметром q . Для примера используется текстовый файл, в котором содержится база данных. Вот фрагмент этого файла:

    1:Пашковский:Краснодарский край:43,0 2:Горячеводский:Ставропольский край:34,4 3:Калинино:Краснодарский край:34,1 4:Приволжский:Саратовская область:32,0 . . . . . . . . . . . . . . . . . . . 268:Залари:Иркутская область:10,0 269:Октябрьский:Пермский край:10,0 270:Ишеевка:Ульяновская область:10,0 271:Жешарт:Республика Коми:10,0 272:Прохоровка:Белгородская область:10,0

    Мы читаем этот файл в массив, а затем в цикле перебираем все строки, в свою очередь разбивая каждую из них в массив, к элементу под номером один (название поселка) которого обращаемся для поиска соответствия с переданным GET-запросом. Если соответствие будет найдена выводим информацию, правда в несколько ином порядке, чем она хранилась в файле.

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

    Вот собственно и все, обращу разве Ваше внимание на то, что для работы со строками использую.