«Всплывающие» подсказки для элементов формы

9 ноября, 2009

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

Но получение фокуса не отрабатывается, если мы пытаемся перетащить в поле ввода выделенный текст со страницы (drag-n-drop) или в браузере отключен JavaScript. В этой ситуации значение «по-умолчанию» нам приходиться удалять вручную и затем уже вводить наш текст.

Я попытался избавиться от этого недостатка и вообще не использовать значение «по-умолчанию» в поле ввода, вместо этого использовать стандартные теги заголовков элементов формы — label.

«Всплывающие» подсказки для элементов формы text и textarea. Каждый тег label привязан к соответствующему тегу input посредством параметра for. Через CSS label позиционируется над элементом input, как всплывающая подсказка и изчезает при получении инпутом фокуса. Если при потере фокуса, если значение input остаётся пустым, то видимость label восстанавливается.

Для большей доступности в браузерах с отключенным JavaScript label можно заранее стилизовать как не перекрывающий элемент input, а при наличии JavaScript программно устанавливать стиль.

Стандартный html-код формы:

<form id="feedback" method="post" action="">
	<div>
		<label for="usermsg">Ваше сообщение</label>
		<div><textarea name="usermsg" id="usermsg" cols="35" rows="8">{$usermsg}</textarea></div>
	</div>

	<div>
		<label for="username">Ваше имя <span>(необязательно)</span></label>
		<div><input name="username" id="username" value="{$username}" /></div>
	</div>
	<div>
		<label for="useremail">E-mail <span>(необязательно)</span></label>
		<div><input name="useremail" id="useremail" value="{$useremail}" /></div>
	</div>
</form>

По правилам w3c элементы формы должны быть обрамлены блочными тегами, например DIV. Функция скрипта запускается после загрузки страницы.

function feedback_labels(container_id) {
	labelsCollection = container_id.getElementsByTagName("LABEL");
	if (labelsCollection.length) {
		for (labelItem in labelsCollection) {
			if ("object" == typeof(labelsCollection[labelItem])) {
				if (labelItemInput = document.getElementById(labelsCollection[labelItem].htmlFor)) {
					labelItemRef = labelsCollection[labelItem];
					if (
						"text" == labelItemInput.type
						||
						"textarea" == labelItemInput.type
					) {
						labelItemRef.style.visibility = "visible";
						labelItemInput.ref = labelItemRef;

						labelItemInput.onfocus = function() {
							this.ref.style.visibility = "hidden";
						}

						labelItemInput.onblur = function() {
							if (!this.value) {
								this.ref.style.visibility = "visible";
							}
						}
					}
				}
			}
		}
	}
}
if (form_feedback = document.getElementById("feedback")) feedback_labels(form_feedback);

Пример работы скрипта можно посмотреть на странице обратной связи сайта ОАО «Маригражданстрой»

© 2009, Дмитрий Швалёв — фотограф, веб-технолог. jour.me

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

При перепечатке материала ссылка на оригинальную статью ««Всплывающие» подсказки для элементов формы» от 9 ноября, 2009 обязательна!

По вопросам коммерческого использования вы можете связаться со мной.

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

все поля обязательны для заполнения

Защита от спама
Подписчики:
Количество подписчиков
Followers:
Followers for @dshster
Подписаться:
Подписка на обновления
  • @prokoudine По нажатию пробела Перемещаться по изображению. 10 марта 2010 в 23:22
  • @AnnaBushueva А попробуйте еще текстурку кожи добавить, я где-то видел через Noise делают, не будет так совсем гладко! А в целом нравится :) 10 марта 2010 в 20:55
  • @nokato Точно так же про наш город :) Хотя его название засветилось в фильме про Иронию судьбы-2 по-моему (я не смотрел) 10 марта 2010 в 20:53
  • @merezha А красиво звучит! :) Кстати, конвертирование raw файлов некоторые фотографы называют "проявкой", а сами файлы цифровыми негативами 10 марта 2010 в 20:39
  • @prokoudine Потыкав сейчас в клавиши нашел "лечение" - одновременное нажатие Пробел+Таб снимает блокировку :-) 10 марта 2010 в 20:33
  • @prokoudine Ubuntu 9.10, ядро 2.6.31-20, unstable GIMP 2.7.1. Блокируется по нажатию пробел на холсте полностью. 10 марта 2010 в 20:10