JavaScript: текст внутри полей, при фокусе и выходе из него

Эта штука часто используется в формах быстрого поиска. Иногда замечаю, что на сайтах либо убирают событие onblur, чтобы по нажатию на кнопку submit, поле не потеряло значение и в поиск не ушла пустая строка, ну и другие не красивые решения, на скорую руку. Для себя я навалял «умную» функцию, которая всегда «знает» как себя правильно вести. Если кому нужно – забирайте.

function clearIt (obj)
{
	if (typeof tmp_value=='undefined')
	{
		tmp_value = obj.value;
	}
 
	if (obj.tagName.toLowerCase()=='form')
	{
		var el, elName;
 
		for (i=0; i<obj.elements.length; i++)
		{
			el = obj.elements[i];
			elName = el.nodeName.toLowerCase();
 
			if (elName=='input' && el.type!='submit' && !tmp_value)
			{
				el.value = '';
				tmp_value = 'undefined';
			}
		}
	}
 
	if (obj.value==tmp_value)
	{
		obj.value = '';
	} else if (obj.value==="")
		{
			obj.value = tmp_value;
		}
}

Вызывать так:

<input type="password" name="password" value="password" onfocus="clearIt(this);" onblur="clearIt(this);">

Этот код эквивалентен:

<input name="story" type="text" onblur="if (this.value == '') {this.value = 'Искать...';}"  onfocus="if (this.value == 'Искать...') {this.value = '';}" value="Искать...">

P.S.
Задумка, конечно не идеальна, но позволяет без дополнительных средств просто и эффективно реализовать достаточно наглядную форму, без не допиленного placeholder и монструозной jQuery.
Если нужно, чтобы перед отправкой значение поля по умолчанию удалялось (если пользователь ничего не ввёл) – поместите в форму событие onsubmit=»clearIt(this);».
Функция пройдётся по всем input и очистит их значения. Кстати пример работы можно посмотреть здесь.

  • Трэкбеки закрыты
  • Комментарии (10)
  1. Три знака равно, это чтобы наверняка?

    • Илья :
      Три знака равно, это чтобы наверняка?

      Это проверка не только на значение, но на тип. То есть (false == «») будет true, а (false === «») будет false.

  2. Ужасный код. Правильно для хранения текста-подсказки использовать соответствующий аттрибут placehold из HTML 5. Тем более JS прямо в HTML писать — моветон, правильнее на input ставить класс, а JS в отдельном файле срабатывает для всех классов.
    Ну и самая главная проблема, если пользователь не заполнит поле и нажмёт Отправить, то эти подсказки окажутся в форме.
    В общем есть куча jQuery плагинов, а этот велосипед ужасен.

      • Анонимно
      • 2 мая, 2010

      Ради одной такой вещи тащить с собой jQuery – это тоже не здорово.

      • Если ссылаться на jQuery на Google AJAX libraries, то пользователю качать ничего не придёться, так как у них jQuery же будет в кеше от другого сайта.

          • Анонимно
          • 2 мая, 2010

          Это конечно хорошо, но всё равно полумеры. Да и не всегда такое можно делать.

        • По-мойму в этом случае проще подобие моего кода сделать и по событию onsubmit чистить поле, если оно равно tmp_value :D

    • Разве placeholder уже работает везде, без проблем?

      • Для тех у кого placehold не работает и вешать обработчик. Как минимум использовать просто, чтобы записывать туда подсказку.

    • Тем более JS прямо в HTML писать — моветон, правильнее на input ставить класс, а JS в отдельном файле срабатывает для всех классов.

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



Введите код с картинки