Делаем автозаполнение на JavaScript

Делаем автозаполнение на JavaScript

Всем привет!

С сегодняшнего дня мы начинаем собирать собственную коллекцию полезных плагинов на jQuery и Mootools. Где-то раз в неделю мы будем делать подробное описание какого-нибудь плагина, решающего насущные задачи рядового верстальщика.

Зачем, просите вы. Ведь есть же Гугл, нужный плагин найти не проблема. Да, Гугл это вещь, но проблема-то в другом — сейчас плагинов развелось столько, что в них черт ногу сломит. Плагинов море, но какие из них хорошие, удобные, быстрокастомизируемые — никто не знает. Поэтому мы и решили делать свою подборку плагинов «проверено на временно» ;-) 

Мы посовещались и я решил начать нашу подборку плагинов с плагина автозаполения полей. В статье мы рассмотрим плагины как под Mootools, так и под jQuery (который я немного доработал).

Предистория

Пару месяцев назад для одного проекта я делал автозаполнение на Mootools. Тут все оказалось проще, чем я думал. Плагинов хоть было и мало, но я нашел то, что искал — плагин от Гаральда Киршнера, автора потрясающих плагинов под Mootools.

Буквально на днях задача повторилась, но теперь нужна была версия под jQuery. «Да как два пальца о кнехт» сказал я и открыл Гугл. Через час выяснилось, что да, плагины есть, много, разные, красивые, но — все не те. Кришнеровского удобства в них не было. 

jQuery версия

Как я уже сказал, подходящих мне плагинов на jQuery не было, но был более-менее похожий — модификация плагина «jQuery Autocomplete» от ПенгоВоркс. Что меня в нем не устраивало? Посмотрим на две картинки: левая — поле поиска в Сафари, правая — работа плагина до моего вмешательства.

jquery autocomplete

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

Итак, посмотрим на код. Привязываем плагин:

<input name="autocomlete" type="text" id="autocomplete" />

<script type="text/javascript" src="jquery/jquery.js"></script>
<script type="text/javascript" src="jquery/jquery.autocomplete.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#autocomplete').autocomplete('backend1.php', {
delay: 10,
minChars: 1,
matchSubset: 1,
autoFill: true,
maxItemsToShow: 10
});
});
</script>

Отлично, файл backend1.php в ответ на GET запрос возвращает нам простой текст, где каждое слово должно быть на новой строке:

<?php 
/* Подключаетесь к базе и
/* выбираете из нужной таблицы
/* нужный столбец */

$res = mysql_query($sql);
while ($street = mysql_fetch_array($res)) {
echo $street['name'].'\r\n'; // Выводите как простой текст
}
?>

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

Демо Скачать

Mootools версия

Как я уже сказал, этот плагин написал Гаральд Кершнер. Скрипт может получать данные как из текущего документа (они ему передаются как параметры), так и запрашивать из с помощью AJAX (HTML или JSON). Я рассмотрю пример с HTML, так он мне ближе и понятнее.

Привязываем скрипт к полю:

<input name="autocomlete" type="text" id="autocomplete" />

<script type="text/javascript" src="mootools/mootools.js"></script>
<script type="text/javascript" src="mootools/Observer.js"></script>
<script type="text/javascript" src="mootools/Autocompleter.js"></script>
<script type="text/javascript" src="mootools/Autocompleter.Request.js"></script>
<script type="text/javascript">
document.addEvent('domready', function() {

var inputWord = $('autocomplete');
new Autocompleter.Request.HTML(inputWord, 'backend.php');

});
</script>

На сервере отдаем данные, соответствующие POST запросу:

<?php 
/* Подключаетесь к базе и
/* выбираете из нужной таблицы
/* нужный столбец */

$res = mysql_query($sql);
while ($street = mysql_fetch_array($res)) {
echo '<li>'.$street['name'].'</li>'; // Выводите как элементы списка
}
?>

Демо Скачать

Надеюсь, что в поисках плагина для автозаполнения вы теперь не будете тратить несколько часов — вы просто зайдете на Временно.нет, перечитаете статью и быстренько сделаете все как надо. Удачи!

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 51

Enlightened
предыстория пишется не так:)
#
Enlightened
Sulla
по поводу доп полей скрипта можно почитать тут :
_http://www.linkexchanger.su/2008/39.html
(вариант для jQuery )
#
Sulla
BullDER
вы как всегда лаконичны и черезвычайно доходчивы
#
BullDER  
adw0rd
Спасибо, пригодится!
adw0rd
echo $street['name'].'

'; // Выводите как простой текст

Может?
."

"
adw0rd
1. Что у вас с парсером кода? Я ввел ."
", а не ."rn"
2. И использовать < pre>< code> - верибед, почему не просто < code>?
adw0rd
Все, я устал бороться с парсером...
зы ." r n "
Grin
adw0rd, с парсером и правда проблемы, поправим. У меня все работает именно так, как я написал в коде ;-)

pre code — это сложилось исторически ;-)
#
Grin  
adw0rd
>У меня все работает именно так, как я написал в коде ;-)
не верю, в апострофе не может выполниться "перенос строки" ;-)
Grin
Ну попробуй, только в заголовке укажи что это text/plain ;-)
#
Grin  
adw0rd
Не подумал :)
slesar
Попробуйте ввести "Санкт-Петербург". В jQuery версии при нажатии на модификатор Shift пропадает окно подсказки. В Mootools появляется прокрутка, а при попытке прокрутить текст - подсказка исчезает.
#
slesar
Влад
Пунктуация режет глаз. Почему перед словом это никогда не пишут тире?
Например: Да, Гугл — это вещь.
#
Влад
Влад
Идея хорошая. Но если делать как в сафари, то надо при вводе слова „Петербург“ выдавать Санкт-Петербург и все города, которые содержат слово.Поиск к тому же тормозит, неизвестно от чего.
#
Влад
Grin
Как искать слова (по вхождению: начало или середина) зависит от выборки на сервере
#
Grin  
adw0rd
Вот, только что внедрил http://kinsburg.ru/
Andrey24may
Ребят, а подскажите в версии на jQuery при вводе любого символа с базы подтягивается все записи, т.е. на любой символ вытягивает первые запси, а не на нужную букву
#
Andrey24may
Денис
Плагин для jQuery конечно неплохой, но лично мне больше понравился — http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/ он:
1) хорошо документирован
2) имеет множество настроек и параметров
3) лежит в сборнике плагинов «официального репозитория» jQuery
4) позволяет легко создавать функции для управления как всем список результатов, так и отдельных их параметров (значение, текст)
5) необходимый бекенд на мой взгляд удобнее и гибче, поддерживается например JSON, если написать самому простую функцию для постобработки полученного хеша
6) удобен редизайн списка результатов через CSS

Из минусов — плагин немного устарел (писался по 1.26, но под 1.3x работает отлично), и автор на него немного подзабил, но тем не менее на мой взгляд решает любые задач по автокомплиту.
#
Денис
Игорь
Спасибо огромное за данный пост. Все понятно и четко написано, и главное полезно. И так же заранее спасибо за «проверено на временно». Буду заходить.
deerua
Да, всё-таки через двойную кавычку пишется перенос для файла (html), через одинарную не будет работать ;)
зы: а ещё актуально мутулс дёргать?
KIVagant
Хм. Жаль, не нашел этой статьи, когда сам реализовывал такую задачу. Правда без излишних наворотов, попроще.
#
KIVagant
Grin
deerua, ну мне иногда он нужен для работы.
#
Grin  
Gram
Денис, упоминаемый Вами плагин обновился.
#
Gram
Сашка
Охуенно.
#
Сашка
Иван
Еще заслуживает внимания автокомплит для jquery ui http://jqueryui.com/demos/autocomplete/
#
Иван
Леонид
Прошу прощения, но никак не пойму, какая именно переменная отправляется в аякс запросе и как её словить в backend1.php, чтобы сделать выборку по соответствующему столбцу таблицы.
#
Леонид
rp
Присоединяюсь к вопросу выше.. Браузер Mozzilaa FireFox 2.0.0.7 под Линукс.
При вводе первого символа вываливается весь список пришедший с сервера, причем даже если в списке нет слов, начинающихся на этот символ. Далее, если вводишь символы не совпадающие с одним из слов, то они заменяются на симолы первого слова в списке (в общем как-будто набираешь первое слово из списка), остальные варианты при этом не пропадают..
#
rp
rp
Это же касается и скрипта, приведенного Денисом с небольшими изменениями.
Например есть список из двух слов: Moscow и SPB. Вводим i, в поле появляется слово ioscow в списке оба наших слова. Вводим u - в поле iuscow ну и т.п. Подскажите пожалуйста, где это правится.. в какой функции хотя бы. Очень нужен такой скрипт, но знаний javascript не достаточно, чтобы самому разобраться где конкретно происходит обработка.
#
rp
Grin
rp, вся обработка происходит на сервере, js только выводит полученные с сервера данные
rp
Не могли бы Вы тогда пояснить алгоритм. Я ввожу 'M', мне на сервер приходит следующая строка запроса: q=M. Я должен выбрать из моих данных слова, начинающиеся на М и отправить скрипту? Так?
Но ведь потом я набираю 'о' и строка запроса выглядит теперь не q=Mo,а q=o.
Не выбирать же мне слова, начинающиеся на о теперь..
Или выборка делается всего один раз по первой букве?
Спасибо за Ваше терпение )
#
rp
Grin
rp, первый раз при наборе 'М' вам приходит q='М', во второй раз — q='Мо'. Оба раза вы делаете что-то вроде SELECT name FROM table WHERE name LIKE '"+q+"%'
rp
Все понятно, напутал что-то с разбором строки запроса, спасибо Вам большое за ответы.
#
rp
andery
а как сделать поиск чтоб при пошаговом вводе слова отсеивались допустим картинки из базы (что то вроде поиска на сайте vkontakte когда вводиш имя друзей они отсеиваются и остаётся один одинёшенек)
#
andery
adw0rd
Когда почините "отписаться от статьи"? Надоел спам уже :)
Defite
О, спасибо большое. Сегодня как раз понадобился autocomplete для рабочего проекта.
Коcтик
Плагин отличный, вопрос как это реализовать без плагинов на JS.

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

Когда самим пишется подобное то просто осознаётся что ничего сложного нет. JQ.. и Moot... уважаю, но не приемлю из за библиотек которые не хочу подключать. Хотя вы наверное скажите или подумаете , вот дурак, зачем писать то что до вас написана и переписано. Дело в том, что что после написания своего класса, вы знаете что можно изменить или как то повлиять на него, добавив ту или иную уникальную фичу, на врятли у вас подобное получится подключив ихние библиотеки, иначе вам придется лесть и перелопатить всё.

Ну соответственно вопрос для кого, если для себя то да, а если же для ком. проекта то и не стоит заворачиваться и тратить неделю на написание.
Evgenij
Костик,
вопрос в том, хотите ли вы решить поставленную задачу в кратчайшие сроки самым оптимальным образом, или же повозившись с кодом, потратив неделю, научиться чему-то.
Это принципиально разные подходы к работе. Но делать надо то, что больше нравится.
Name
а где переменная get? ппц афтар херовый пост ничего не ясно
#
Name
Name
rp скажи пожалуйста как проблему решил?
$autocomplete = $_GET['autocomplete'];
$sql = mysql_connect("localhost","root","");
mysql_select_db("data");
$res = mysql_query("SELECT words FROM auto WHERE words LIKE '%$autocomplete

%'");

while ($street = mysql_fetch_array($res))
{
echo $street['words']."
";
}

та же проблема что и у rp.. может я что то делаю не так?

#
Name
Name
и вообще что за привычка такая решив проблему не отписаться как ты её решил..
#
Name
NoName
Name, тебе удалось решить проблему?
У меня такая же ситуация...((
#
NoName
name
нет не решил
автор будь человеком скажи какой запрос при выборке из базы нужно делать?
$res = mysql_query("SELECT words FROM `auto` WHERE words LIKE '$autocomplete%'");
при таком слова выделяются но не сортируются помоги!
#
name
Grin
name, я не понимаю, что именно не работает? Смотришь фаербагом какая переменная посылается на сервер, там делаешь запрос. Какая нужна сортировка?
#
Grin  
name
мне нужно что бы было как в примере пишешь город и он сортировался по буквам т.е я нажимаю букву с и выпадает саратов сахалин...
но у меня при таком запросе $res = mysql_query("SELECT words FROM `auto` WHERE words LIKE '$autocomplete%'");
вылазят все слова.
какую переменную надо писать в LIKE? а лучше кинь исходный код backend.php который у тебя в примере.
#
name
Grin
У меня не осталось кода бэкэнда, я делал это пример год назад.

Выдаются все города, так как ты используешь не ту переменную. Возьми фаербаг, посмотри во вкладке «Сеть» какая переменная посылается при запросе (скорее всего q).
#
Grin  
name
переменная $_POST['value'] вот она она))
для работы с кириллицой добавляем iconv("UTF-8", "WINDOWS-1251", $pz1); в бэкенд.
на всякий случай вот весь код

header("Content-type: text/html; charset=windows-1251");
$sql = mysql_connect("localhost","root","");
mysql_select_db("data");
$pz1 = $_POST['value'];
$pz = iconv("UTF-8", "WINDOWS-1251", $pz1);
$res = mysql_query("SELECT words FROM auto WHERE words LIKE '$pz%'");
while ($street = mysql_fetch_array($res))
{
echo ''.$street['words'].'';
}

автор спасибо!!
#
name
petrik
Как сделать так, что бы был множественный выбор,
слова нужно вводить через запятую? Нужно для работы с тегами!!! Подскажите, плз.
#
petrik
Lex
А Вы когда плагин переделывали, не вырезали из него возможность вставить данные прямо в конфиг, без использования ajax-запросов?
#
Lex
kibi
Подскажите а как заставить работать выбор из сформированного списка мышкой, клавиатурой нормально выбирает а мышкой нехочет.
#
kibi
tokamame
у меня в первом варианте при наборе текста он заменяется на кракозябры, а второй вариант вообще не предлагает ничего при наборе
xalidov
Круто! Задолбал этот робоформ)))

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть

metin2 pvp metin2 pvp serverler pvp serverler