Делаем автозаполнение на 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>
разрешенные теги или посмотреть как будет выглядеть
counter strike mt2 silkroad pvp metin2 metin2 pvp knight pvp gm olarak başlayan pvpler pvp silkroad pvp serverler counter strike serverler msn show cam show görüntülü sohbet oyunlar suskunlar gazete oku