670
 

Улучшаем 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 - Большой каталог товаров для спорта и активного отдыха

Комментарии на “Улучшаем HTML формы при помощи jQuery”

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

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

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

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

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

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

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

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

  8. [...] демо Источник: 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 при [...]

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

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

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

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

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

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

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

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

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

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

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

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

  16. У меня подгружается из БД в спрятанный 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 на динамическое значение, чтоб можно было задавать любое.

  17. Можно ли вот так вписать:
    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);
    });
    ???

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

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

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

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

  21. Для второго поля автокомплит использовать не нужно. Создайте объект с указанными выше значениями. Потом подставляйте их по ключу:
    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 будет срабатывать при выборе значения автокомплитом.

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

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

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

    $(\’#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\’,\’\');
    });

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  33. @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 (дирекция …)

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

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

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

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

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

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

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

Оставить комментарий

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