Улучшаем HTML формы при помощи jQuery

В этой статье я хочу поделиться с Вами некоторыми приемами усовершенствования HTML форм при помощи JavaScript. В частности, в приведенных здесь примерах используется библиотека jQuery. Речь здесь пойдет о четырех усовершенствованиях – подсказках, автозаполнении, счетчике введенных символов и скрытых полях.

Всплывающие подсказки

demo-form-1.png

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

HTML код:

<h1>Демонстрация примера подсказок для полей форм.</h1>
<form action="" id="myForm">
<fieldset>
    <legend>Установите курсор в одно из полей.</legend>
    <label for="username">Логин</label><br/>
    <input type="text" name="username" value="" />
    <label for="username" class="fieldHint">Введите имя пользователя (не более 20 символов)</label>
    <br/>
    <label for="password">Пароль</label><br/><input type="password" name="password" value="" />
    <label for="password" class="fieldHint">Введите Ваш пароль</label><br/>
</fieldset>
<input type="submit" name="" value="Отправить" />
</form>

JavaScript

$(document).ready(function(){
	$('#myForm input').focus(function(){
		var name = $(this).attr('name');
		$('label.fieldHint[for="'+name+'"]').fadeIn('slow');
	}).blur(function(){
		var name = $(this).attr('name');
		$('label.fieldHint[for="'+name+'"]').fadeOut('slow');
	});
});

В начале, мы получаем ссылки на текстовые поля, для которых нужно показывать подсказки. Для этих полей мы устанавливаем обработчики событий onfocus и onblur, которые вызываются при получении и потере полем фокуса. В обработчиках этих двух событий мы получаем ссылки на сами подсказки (подсказки хранятся в элементах label с атрибутом for равным имени поля), и плавно показываем их функцией fadeIn().

Смотреть демо

Автозаполнение полей.

Автозаполнение – это такая функция, которая предоставляет варианты ответа при вводе пользователем текста в поле. Если пользователь выбирает один из предложенных вариантов, то он автоматически подставляется в текстовое поле.

demo-form-2.png

Для реализации такой функции существует множество плагинов. В целях демонстрации я выбрал один из них – jQuery.autocomplete. Работает он предельно просто – нужно просто подключить скрипт и вызвать функцию autocomplete() для нужного поля, передав в качестве аргумента массив вариантов для заполнения либо URL из которого он будет получен.

HTML

<form action="" id="myForm">
<fieldset>
<legend>Начинайте вводить слова в следующее поле (например, буквы C, П)</legend>
    <label for="keyword">Ключевое слово</label><input type="text" name="keyword" value="" />
</fieldset>
<input type="submit" name="" value="Поиск" />
</form>

JavaScript

$(document).ready(function(){
var data = "Селекторы Атрибуты Манипуляция События CSS Эффекты Ajax Утилиты Плагины Поиск DOM Функции Скрипты".split(" ");
$("#myForm input[name='keyword']").autocomplete(data);
});

Смотреть демо

Счетчик символов в текстовом поле

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

demo-form-3.png

HTML

<form action="" id="myForm">
<fieldset>
<legend>Начинайте вводить текст в поле "Имя пользователя"</legend>
    <label for="username">Имя пользователя</label><br/><input type="text" name="username" value="" />
    <label for="username">осталось <span id="username_counter">20</span> символов</label><br/>
    <label for="password">Пароль</label><br/><input type="password" name="password" value="" /><br/>
</fieldset>
<input type="submit" name="" value="Отправить" />
</form>

JavaScript

$(document).ready(function(){
	// вычисляем первоначальное значение счетчика и его цвет
	var value = $('#myForm input[name="username"]').attr('value') || '';
	var initLength = Math.max((value ? (20 - value.length) : 20),0);
	$('#username_counter').css('color', 'rgb('+(12*value.length)+', 0, 0)');
	$('#username_counter').html(initLength.toString());

	$('#myForm input[name="username"]').keyup(function(){
		var value = $(this).attr('value') || '';
		var lengthToGo = Math.max((20 - value.length),0);
		$('#username_counter').css('color', 'rgb('+(12*value.length)+', 0, 0)');
		$('#username_counter').html(lengthToGo.toString());
	});
});

Количество введенных элементов в поле вычисляется при событии onkeyup, значение счетчика устанавливается функцией html(), а цвет функцией css(). Для установки цвета используется формат RGB. В этом примере я использовал коэффициент 12, который умножался на количество введенных символов. Поскольку в примере максимальное количество символов равняется 20, то максимаьный уровень красного цвета счетчика равняется 240. Если вы будете использовать такой счетчик, то значение коэффициента нужно пересчитать, чтобы максимальный уровень красного цвета не превышал 255.

Смотреть демо


Скрытое текстовое поле

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

demo-form-4.png

HTML

<form action="" id="myForm">
<fieldset>
<legend>Хотите ли Вы получать новости на Email?</legend>
    <input type="radio" name="newsletter" id="newsletter-0" value="0" checked /><label for="newsletter">Нет</label><br/>
    <input type="radio" name="newsletter" id="newsletter-1" value="1" /><label for="newsletter">Да</label><br/>
    <div id="email" style="display:none">
        <label for="email">Введите Ваш email:</label><input type="text" name="email" value="" />
    </div>
</fieldset>
<input type="submit" name="" value="Ввод" />
</form>

JavaScript

$(document).ready(function(){
	$('#newsletter-1').click(function(){
		$('#email').fadeIn('slow');
	});

	$('#newsletter-0').click(function(){
		$('#email').fadeOut('slow');
		$('input[name="email"]').attr('value','');
	});
});

Этот код предельно прост. Здесь используются всего лишь две функции fadeIn() и fadeOut(), которые соответственно показывают и скрывают скрытое поле. При скрытии поля мы также очищаем значение атрибута value, чтобы предотвратить отправку данных на тот случай, если пользователь что-то ввел в поле, а позже передумал и выбрал опцию “Нет”.

Смотреть демо

Maklay.com - Большой каталог товаров для спорта и активного отдыха
  • Илья

    Подстажите, пожалуйста, как можно сделать всплывающую подсказку для select?

  • admin

    @Илья
    Это делается точно также, как и для текстовых полей. У select ведь тоже есть события onfocus и onblur. Просто я использовал в коде селектор ‘#myForm input’, ибо в примере только текстовые поля, а вы добавьте ‘#myForm select’.

  • Илья

    Спасибо большое за помощь! Все великолепно работает!
    Можно вас попросить помочь с одним несложным java-скриптом, который великолепно работает в ie, но в мозиле работает весьма своеобразно?

  • Илья

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

  • admin

    @Илья
    Ну это логично, подсказки ведь показываются изменяя параметр display. Чтобы не раздвигалась, можно поместить подсказку в другой контейнер с фиксированной высотой.

    > Можно вас попросить помочь с одним несложным java-скриптом…
    Попробую помочь. Вышлите ссылку на ваш скрипт, либо вышлите мне на email (ischenkodv@gmail.com).

  • Илья

    Спасибо большое за предложение помощи – разобрался сам со своими скриптами.
    Но есть все-таки один висящий вопрос – возможно ли все-таки сделать так, чтобы страница раздвигалась при выводе подсказки, но нижеследующий визивик не портил картину своими кнопочками на старом месте? потому как если раздвигать заранее форму, то получается очень некрасиво (подсказки многострочные получаются – по 5-10 строк).

  • admin

    @Илья
    О визивике слышал, но никогда с ним не работал. Врядли смогу подсказать, как с ним бороться. Тут надо вооружиться фаербагом и смотреть, какие стили у этих кнопочек, и как их можно исправить.

  • http://all.text.md/2009/01/05/html-forms-jquery/ Доработка HTML Form при помощи jQuery | Непутевые заметки

    [...] демо Источник: http://www.jstoolbox.com/2008/08/10/uluchshaem-html-formy-pri-pomoshhi-jquery/ okbm(”http://all.text.md/2009/01/05/html-forms-jquery/”,”Доработка HTML Form при [...]

  • SaM

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

    115300
    <!—->
    SCN51TS60KK
    SC
    <!—->

    114794
    <!—->
    CNDT8BRGL0
    DR
    <!—->

    114781
    <!—->
    CNH1D00555
    DR
    <!—->

    интересно было бы или по name или же по id=”InNr”

  • Татьяна

    Простите за глупый вопрос. Но как этот скрипт надо вставлять? Имеется ли разница между вставкой в пчп-страницу или хтмл-страницу? (у меня пчп-страницы). проверяю скрипт на локальном сервере, не считает символы. может их нужно проверять в сети?

  • admin

    @Татьяна
    Нет разницы куда вставлять, в php или html. Если у вас php, то он должен запускаться на сервере, либо локально либо удаленно, разницы здесь нет, а скрипт в свою очередь должен возвращать html, в котором вы уже указываете скрипт обработчик формы. Проверьте, получает ли браузер все указанные вами скрипты JavaScript.

  • Alex

    Добрый день, а можно ли сделать при помощи jQuery, чтоб при заполнения одного поля ввода, атоматически заполнялось второе? Например я ввожу в первое поле цифру, а во второе введётся автоматом значение которе стоит за этой цифрой: 125 – это 125ое значение
    Что-то в этом роде.

  • admin

    @Alex
    Да, так можно сделать. Нужно по событию onkeyup проверять содержимое поля и соответствующим образом заполнять соседнее поле. Приблизительно так:
    $(’#myForm input[name="username"]‘).keyup(function(){
    var value = $(this).attr(’value’) || ”;
    if (value == 125)
    $(’myForm input[name="another_field"]‘).value= ‘125-ое’;
    // … и так далее
    });

  • Alex

    Cпасибо огромное за такой скорый ответ!!! Сейчас же сразу попробую в деле.
    Дело в том, что у меня уже для первого поля работает автозаполнение вот в таком виде:
    $(document).ready(function(){
    data = [];
    $(”td[id='InNr']“).each(function() { data.push($(this).text()); });
    $(”#myForm input[name='badge0']“).autocomplete(data);
    $(”this”).scrollTop(); });

    Сейчас буду экперементировать с вашим советом. Попробую пока сам. У меня ещё нет опыта работы с jQuery.

  • admin

    @Alex
    Понятно. Но вот этот вот селектор странноват:
    $(”td[id='InNr']“) – он выделяет все ячейки таблицы с id = lnNr ? В документе не должны повторяться элементы с одинаковым id, иначе могут быть проблемы.

  • Alex

    У меня подгружается из БД в спрятанный div целый лист информации. в div’e таблица с тегами в две колонки. в первой колонке номер, а за ним к нему описание. вот по номеру у меня получилось автозаполнение и оно работает на отлично. firebug не показывает никаких ошибок. Теперь появилась потребность показывать по первому номеру и информацию к нему. А как реализовать я сам не дотюмкал.

    Сейчас подогнал код вот так:
    $(document).ready(function(){
    data = [];
    $(”td[id='InNr']“).each(function() { data.push($(this).text()); });
    $(”#myForm input[name='badge0']“).keyup(function(){
    var value = $(this).attr(’value’) || ”;
    if (value == 125)
    $(”#myForm input[name='UpInformation0']“).autocomplete(badgeinfo);
    });
    Теперь не хватает знаний, как тут заменить 125 на динамическое значение, чтоб можно было задавать любое.

  • Alex

    Можно ли вот так вписать:
    data = [];
    $(”td[id='InNr']“).each(function() { data.push($(this).text()); });
    $(”#myForm input[name='badge0']“).keyup(function(){
    var value = $(this).attr(’value’) || ”;
    if (value == $(”#myForm input[name='badge0']“).autocomplete(data);)
    $(”#myForm input[name='UpInformation0']“).autocomplete(badgeinfo);
    });
    ???

  • admin

    Автокомплит предлагает варианты заполения или сразу готовое значение подставляет? Какие значения должны подставляться, приведите реальный пример, а то задача не совсем ясна.
    Кроме того, непонятно зачем подгружать информацию в скрытый див, а потом выделять из него данные скриптом, можно ведь сразу вывести информацию на страницу в нужном виде, а потом использовать его:
    <script type=”text/javascript”>
    var data = [ '1' , '2', '3' .... ];
    </script>

  • admin

    if (value == $(”#myForm input[name='badge0']“).autocomplete(data);)
    так нельзя.

  • Alex

    Погружается в див больше тысячи строчек информации такого вида:
    12345 текст
    12346 текст
    12347 текст
    12348 текст
    …..

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

  • admin

    Для второго поля автокомплит использовать не нужно. Создайте объект с указанными выше значениями. Потом подставляйте их по ключу:
    var props = { 12345 : “текст”, “12348″ : “текст2″ }
    var data = [];

    $(”td[id='InNr']“).each(function() {
    data.push($(this).text());
    });
    $(”#myForm input[name='badge0']“).autocomplete(data);
    $(”#myForm input[name='badge0']“).keyup(function(){
    var value = $(this).attr(’value’) || ”;
    var myValue = props[value] || ”;
    $(”#myForm input[name='UpInformation0']“).val(myValue);
    });
    То есть, если вы ввели значение 12345 (переменная value), то тогда props[value] будет равно “текст”. Я вот только не уверен то keyup будет срабатывать при выборе значения автокомплитом.

  • ALEXEY

    Здравствуйте
    Есть вот такой у Вас пример Скрытое текстовое поле

    принцип работы не как у Вас нажал (да) открылась нажал (нет) закрылась
    а вот такой нажал на (первою) кнопку открылась нажал на (вторую) (первая) закрылась а (вторая) открылась

    как можно организовать это с большим количеством радио кнопок я могу только с двумя а вот больше не могу

    $(\’#reply_1\’).click(function(){
    $(\’#phone\’).fadeIn(\’slow\’);
    });
    $(\’#reply_2\’).click(function(){
    $(\’#e_mail\’).fadeIn(\’slow\’);
    });

    $(\’#reply_2\’).click(function(){
    $(\’#phone\’).fadeOut(\’slow\’);
    $(\’input[name="phone"]\’).attr(\’value\’,\’\');
    });
    $(\’#reply_1\’).click(function(){
    $(\’#e_mail\’).fadeOut(\’slow\’);
    $(\’input[name="e_mail"]\’).attr(\’value\’,\’\');
    });

  • http://bourovstudio.com bourov

    $(document).ready(function(){
    var data = “”.split(” “);
    $(”#name”).autocomplete(data);
    });

    После выполнения цикла : просмотр кода из explorer:

    $(document).ready(function(){
    var data = “Метал Металопрокат Бензин Большой кран “.split(” “);
    $(”#name”).autocomplete(data);
    });

    при этом переменные, которые записываются в var : Метал, Металопрокат, Бензин, Большой кран,

    Проблема: При наборе в текстовом поле (если я хочу набрать Большой кран) он мне предлогает только слово Большой.
    Пробовал выводить через запятую, но тогда предложение идёт только на первое слово т.е. Метал.
    Возникает следующий вопрос: Как вывести так, чтобы предложение шло на словосочетание, а не его первое слово.

    Предположение: ответ кроется в split(” “);
    либо multiple: true,
    multipleSeparator: ” “,

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

  • admin

    @buorov
    После выполнения этой строки
    var data = “Метал Металопрокат Бензин Большой кран “.split(” “);
    в data будет “Бензин”, “Большой”, “Кран”, соответственно словосочетания “Большой кран” там нет.
    Сделайте так:
    var data = “Метал,Металопрокат,Бензин,Большой кран”.split(”,”);

  • st

    Я малость запутался, может подскажете.
    Как “Скрытое текстовое поле” с select сделать?

  • admin

    @st
    Точно также, как и с текстовым, только вместо input используйте select внутри div-a:
    <div id=”email” style=”display:none”>
    <label for=”email”>Введите Ваш email:</label>
    <select name=”email”>…</select>
    </div>

  • st

    Я наверное неправильно выразился, прошу прощения!
    При выборе из selekt появляется email:
    Вопрос?

    ДА
    НЕТ
    Другое (укажите)

    Введите Ваш email:

    должен срабатывать на value=”3″.

  • http://atstudio.kiev.ua Kotta

    Почитал ваши скрипты – все просто отлично, все рабоает. Благодарю за помощь в создании сайта. Единственный вопрос – можно ли сделать проверку на кол-во символов для textarea а не для text field? То есть для полей с несколькими строчками, в которых нет атрибута value а содержание записывается между тегами example

  • admin

    @Kotta
    Чтобы получить текст из textarea тоже используется параметр value, хоть он и не присутствует в виде атрибута:
    var str = myTextarea.value;
    var strLength = str.length;

  • http://atstudio.kiev.ua Kotta

    @admin
    Спасибо большое за скорый ответ, все прекрасно работает. Честно говоря, просто изменил input на textarea в скрипте и все стало на свои места. Пока вы не ответили, я почему-то не мог додуматься так сделать.

  • NovaC

    Спасибо за предложенные приемы усовершенствования.
    Хотелось бы уточнить по “Всплывающим подсказкам”: при отображении многострочной подсказки – все элементы страницы расположенные следом смещаются.
    Возможна ли реализация отображения без сдвига? По возможности хотелось бы подробный ответ.
    Спасибо. С уважением, NovaC.

  • admin

    @NovaC
    Это зависит от того, как вы реализовали стили для элементов формы. Можно, например, текстовое поле и подсказку заключит в div и тогда ничего расползаться не должно.

  • NovaC

    @admin
    стили только те что примере, использую select а не текстовое поле.
    Заключать в уже пробывал – не получается:

    label.fldHint{display:none;background:#ffc;margin:0 10px;padding:0 6px;border:1px solid #ccc;}
    #filter select,#filter label {float:left}

    В
    Г

    V

    В (служба …)
    Г (дирекция …)
    …..
    V (дирекция …)

  • admin

    Можно так – поставьте для select-а и label параметры display:block; float: left; width: 49%;
    После label добавьте еще один элемент <div style=”clear:both”></div>
    И все это добро заключить в div.

  • http://atstudio.kiev.ua Kotta

    Здравствуйте опять) Я использовал ваш мануал для создания скрытого текстового поля, и у меня возникла одна загвоздка. А именно, в качестве текстового поля, я использовал поле select, и мне нужно, чтобы при нажатии radio “нет” поле select выбирало 1-й пункт.
    То есть в коде:
    $(’#newsletter-0′).click(function(){
    $(’#email’).fadeOut(’slow’);
    $(’input[name="email"]‘).attr(’value’,”);
    });
    мне нужно поменять изменение value поля, однако для select это не работает. Не подскажете, как можно модифицировать код?

  • admin

    Чтобы поменять значение поля select, используйте функцию val(): $(’myselect’).val(3);
    В качестве параметра должно быть значение опции, которую нужно выбирать.

  • http://atstudio.kiev.ua Kotta

    Так, пока не работает.
    У меня записано в виде:
    $(’#select[name="Projects"]‘).val(1);
    Может быть что-то неправильно?

  • admin

    Ну а решетка перед селектом зачем?

  • http://atstudio.kiev.ua Kotta

    Думал она нужна. Все отлично работает. Спасибо большое))))

  • http://text.md/html-forms-jquery/ Доработка HTML Form при помощи jQuery

    [...] Смотреть демо Источник: http://www.jstoolbox.com/2008/08/10/uluchshaem-html-formy-pri-pomoshhi-jquery/ [...]

JSToolbox создан на основе WordPress