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

18 сентября 2009, 10:43 Павел Марковнин JavaScript рейтинг +18-

Автозаполнение на 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>'; // Выводите как элементы списка
}
?>

Демо Скачать

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

Рекламное место, которое может стать вашим

Понравилась статья?

Тогда подпишись на обновления через RSS или воспользуйся
другими способами подписки.

Читать в Яндекс.Ленте Добавить в Google Добавить в Netvibes
  •  

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

RSS
  • Аватарка
    18 сентября 2009 в 11:59 Enlightened
    предыстория пишется не так:)
  • Аватарка
    18 сентября 2009 в 12:03 Sulla
    по поводу доп полей скрипта можно почитать тут :
    _http://www.linkexchanger.su/2008/39.html
    (вариант для jQuery )
  • Аватарка
    18 сентября 2009 в 12:21 BullDER
    вы как всегда лаконичны и черезвычайно доходчивы
  • Аватарка
    18 сентября 2009 в 13:24 ]]>adw0rd]]>
    Спасибо, пригодится!
  • Аватарка
    18 сентября 2009 в 14:13 ]]>adw0rd]]>
    echo $street['name'].'rn'; // Выводите как простой текст

    Может?
    ."rn"
    
  • Аватарка
    18 сентября 2009 в 14:15 ]]>adw0rd]]>
    1. Что у вас с парсером кода? Я ввел ."rn", а не ."rn"
    2. И использовать < pre>< code> - верибед, почему не просто < code>?
  • Аватарка
    18 сентября 2009 в 14:16 ]]>adw0rd]]>
    Все, я устал бороться с парсером...
    зы ." r n "
  • Аватарка
    18 сентября 2009 в 14:22 ]]>Grin]]>
    adw0rd, с парсером и правда проблемы, поправим. У меня все работает именно так, как я написал в коде ;-)

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

    Из минусов — плагин немного устарел (писался по 1.26, но под 1.3x работает отлично), и автор на него немного подзабил, но тем не менее на мой взгляд решает любые задач по автокомплиту.
  • Аватарка
    19 сентября 2009 в 12:48 ]]>Игорь]]>
    Спасибо огромное за данный пост. Все понятно и четко написано, и главное полезно. И так же заранее спасибо за «проверено на временно». Буду заходить.
  • Аватарка
    19 сентября 2009 в 13:21 ]]>deerua]]>
    Да, всё-таки через двойную кавычку пишется перенос для файла (html), через одинарную не будет работать ;)
    зы: а ещё актуально мутулс дёргать?
  • Аватарка
    21 сентября 2009 в 13:14 KIVagant
    Хм. Жаль, не нашел этой статьи, когда сам реализовывал такую задачу. Правда без излишних наворотов, попроще.
  • Аватарка
    21 сентября 2009 в 13:25 ]]>Grin]]>
    deerua, ну мне иногда он нужен для работы.
  • Аватарка
    25 сентября 2009 в 10:13 ]]>Gram]]>
    Денис, упоминаемый Вами плагин обновился.
  • Аватарка
    3 февраля в 11:00 Сашка
    Охуенно.
  • Аватарка
    31 марта в 15:04 Иван
    Еще заслуживает внимания автокомплит для jquery ui http://jqueryui.com/demos/autocomplete/
  • Аватарка
    16 мая в 0:23 Леонид
    Прошу прощения, но никак не пойму, какая именно переменная отправляется в аякс запросе и как её словить в backend1.php, чтобы сделать выборку по соответствующему столбцу таблицы.
  • Аватарка
    30 мая в 19:30 rp
    Присоединяюсь к вопросу выше.. Браузер Mozzilaa FireFox 2.0.0.7 под Линукс.
    При вводе первого символа вываливается весь список пришедший с сервера, причем даже если в списке нет слов, начинающихся на этот символ. Далее, если вводишь символы не совпадающие с одним из слов, то они заменяются на симолы первого слова в списке (в общем как-будто набираешь первое слово из списка), остальные варианты при этом не пропадают..
  • Аватарка
    30 мая в 20:17 rp
    Это же касается и скрипта, приведенного Денисом с небольшими изменениями.
    Например есть список из двух слов: Moscow и SPB. Вводим i, в поле появляется слово ioscow в списке оба наших слова. Вводим u - в поле iuscow ну и т.п. Подскажите пожалуйста, где это правится.. в какой функции хотя бы. Очень нужен такой скрипт, но знаний javascript не достаточно, чтобы самому разобраться где конкретно происходит обработка.
  • Аватарка
    30 мая в 20:18 ]]>Grin]]>
    rp, вся обработка происходит на сервере, js только выводит полученные с сервера данные
  • Аватарка
    30 мая в 20:33 rp
    Не могли бы Вы тогда пояснить алгоритм. Я ввожу 'M', мне на сервер приходит следующая строка запроса: q=M. Я должен выбрать из моих данных слова, начинающиеся на М и отправить скрипту? Так?
    Но ведь потом я набираю 'о' и строка запроса выглядит теперь не q=Mo,а q=o.
    Не выбирать же мне слова, начинающиеся на о теперь..
    Или выборка делается всего один раз по первой букве?
    Спасибо за Ваше терпение )
  • Аватарка
    30 мая в 20:36 ]]>Grin]]>
    rp, первый раз при наборе 'М' вам приходит q='М', во второй раз — q='Мо'. Оба раза вы делаете что-то вроде SELECT name FROM table WHERE name LIKE '"+q+"%'
  • Аватарка
    30 мая в 20:47 rp
    Все понятно, напутал что-то с разбором строки запроса, спасибо Вам большое за ответы.
  • Аватарка
    1 июня в 2:59 andery
    а как сделать поиск чтоб при пошаговом вводе слова отсеивались допустим картинки из базы (что то вроде поиска на сайте vkontakte когда вводиш имя друзей они отсеиваются и остаётся один одинёшенек)
  • Аватарка
    1 июня в 12:45 ]]>adw0rd]]>
    Когда почините "отписаться от статьи"? Надоел спам уже :)
  • Аватарка
    29 июня в 19:48 ]]>Defite]]>
    О, спасибо большое. Сегодня как раз понадобился autocomplete для рабочего проекта.
  • Аватарка
    30 августа в 17:17 ]]>Коcтик]]>
    Плагин отличный, вопрос как это реализовать без плагинов на JS.

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

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

    Ну соответственно вопрос для кого, если для себя то да, а если же для ком. проекта то и не стоит заворачиваться и тратить неделю на написание.
  • Аватарка
    30 августа в 23:04 ]]>Evgenij]]>
    Костик,
    вопрос в том, хотите ли вы решить поставленную задачу в кратчайшие сроки самым оптимальным образом, или же повозившись с кодом, потратив неделю, научиться чему-то.
    Это принципиально разные подходы к работе. Но делать надо то, что больше нравится.
  • Аватарка
    4 сентября в 17:15 Name
    а где переменная get? ппц афтар херовый пост ничего не ясно
  • Аватарка
    4 сентября в 17:30 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']."rn";
    }

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

  • Аватарка
    4 сентября в 17:31 Name
    и вообще что за привычка такая решив проблему не отписаться как ты её решил..
  • Эл. почта (используется для Граватарки)
  • Домашняя страница
  • Имя в Твиттере
  • Разрешенные теги Текст сообщения (надо бы заполнить это поле)
  • как выглядит какой тег
    жирный текст <b>жирный текст</b>
    курсивный тект <i>курсивный тект</i>
    зачеркнутый текст <s>зачеркнутый текст</s>
    подчеркнутый текст <u>подчеркнутый текст</u>
    ссылка <a href="адрес">ссылка</a>
    function foo() { ... }
    <pre><code>function foo() { ... } </code></pre>