На Главную

Украшаем input с помощью CSS. Unobtrusive JavaScript.

October 13th, 2008 by Yuriy Drozdov

Решил продолжить сагу об украшениии input. (Начало можно почитать в статьях Украшаем input с помощью CSS и Украшаем input с помощью CSS. Продолжение.) В прошлой статье у нас получился такой html:

HTML:
  1. <input type="text" id="find" name="find" value="Введите текст для поиска" onfocus="this.style.backgroundColor='#F0F0F0';this.value='';" onblur="this.style.backgroundColor='#FFFFFF';if (this.value != '') {this.onfocus = function(){this.style.backgroundColor='#F0F0F0';};} else this.value='Введите текст для поиска';" />

Беда в том, что с отключенным javascript пользователь может не понять предназначение данного элемента ввода. Исправим эту досадную ошибку добавлением элемента label, а весь javascript для input вынесем в отдельную функцию.

HTML:
  1. <label for="find" class="hint">Введите текст для поиска:</label>
  2. <input type="text" id="find" name="find" value="Введите текст для поиска" />

Далее, наша задача сделать так, чтобы при отключенном javascript пользователь видел подсказку в виде текста в элементе label, а при включеном javascript текст подсказки был в самом input. Реализуем это в javascript с помощью jquery.

JAVASCRIPT:
  1. $(document).ready(function(){
  2.   // для каждого элемента lable имеющего атрибут class со значением hint выполняем следующие действия
  3.   $('label.hint').each(function() {
  4.     var label = $(this);
  5.     // получаем элемент input у которого атрибут id совпадает с атрибутом for у элемента label
  6.     var input = $('#' + label.attr('for'));
  7.     //прячем элемент label и устанавливаем переменную initial равной тексту элемента label без двоеточия
  8.     var initial = label.hide().text().replace(':', '');
  9.     // устанавливаем обработчики событий focus и blur для элемента input
  10.     input.focus(function() {
  11.       //меняем цвет заднего фона input
  12.       input.css('backgroundColor', '#F0F0F0');
  13.       //если текст в поле ввода это наша подсказка, то по получению фокуса очищаем input
  14.       if (input.val() == initial) {
  15.         input.val('');
  16.       }
  17.       }).blur(function() {
  18.         //меняем цвет заднего фона
  19.         input.css('backgroundColor', '#FFFFFF');
  20.         //если ничего не введно в поле ввода, то при удалении фокуса помещаем нашу подсказку
  21.         if (input.val() == '') {
  22.           input.val(initial);
  23.         }
  24.      //в поле ввода помещаем нашу подсказку
  25.      }).val(initial);
  26.   });
  27. });


В действии описанное выше можно увидеть ниже.


Почитать

Unobtrusive JavaScript with jQuery

Автор: Yuriy Drozdov

Похожие статьи:

RSS комментариев

10 Комментариев

Comment by hayk Subscribed to comments via email
2008-10-15 15:32:04

Великолепная статья! Продолжай в том же духе.
Единственное, надо что-то сделать с копированием кода из статей.

Comment by Yuriy Drozdov
2008-10-15 15:42:08

Спасибо. Хорошо, посмотрю, что можно с этим придумать.

 
 
Comment by Warlock Subscribed to comments via email
2008-10-18 13:59:00

Эх, IE - зло, под ним не работает скрипт…

Comment by hayk Subscribed to comments via email
2008-10-18 17:24:48

Все работает под IE, просто у Юры в исходник как-то попали теги br, их надо подчистить (см. ошибку javascript’а).

Comment by Yuriy Drozdov
2008-10-19 12:16:28

Спасибо, поправил.

 
 
 
Comment by Warlock Subscribed to comments via email
2008-10-18 19:18:56

Спасибо, ваша правда.

 
2008-10-27 08:39:35

Спасибо, пригодилось! :-) Как хорошо, что не нужно мучиться с JavaScript’ом (потому что плохо его знаешь), просто взял, поправил пару кусочков кода — и готово! :-)

 
Comment by Иванов Сергей Subscribed to comments via email
2009-04-12 14:33:28

Юрий: нескромный вопрос: а из какой библиотеки функция ‘$’, с помощью которой достаём все элементы типа ‘label’ css-класса ‘hint’ из document’а (в JavaScript коде, насколько я не заблуждаюсь, именно это делается с помощью вызова $(’label.hint’))? Я подключил ajax v.1.0.4; ajax’овская функция ‘$’ с параметрами ‘label.hint’ возвращает null :( (

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

“Мол, в такой-то и такой-то библиотеке ‘Библиотека’, используемую в коде данной статьи версию которой библиотеки, кстати, можно закачать по адресу ‘Адрес’, функция ‘$’ при вызове возвращает стандартный JavaScript массив, к которому применяется добавленная данной библиотекой к данному массиву (а, быть может, и вообще к prototype объекта Array, то есть ко всем массивам) функция ‘each(call_back)’, которая функция each применяет переданную ей в качестве аргумента функцию call_back к каждому элементу возвращённого функцией ‘$’ массива”, и делает то-то (а тут см. код)”.

А то иначе просто непонятно, как запустить код, чтоб он сработал у тебя. :) Я, например, хотя и посмотрел исходники страницы с этой статьёй, и скачал все подключаемые через тэг с определённым атрибутом src .js-файлы, всё равно так и не отыскал одного-единственного файла, в котором определяется функция ‘$’ :) Так что мне остаётся только восхищаться мастерством автора этой статьи. :)

Неужели все, кто пишет комментарии к этой статье, знают, КАКАЯ библиотека должна быть подключена, просто по виду вызовов функции этой библиотеки (например, “Ага, используется each, значит, это не Ajax…”)? :) )

А так, вообще, код работает (у меня, по крайней мере, в Firefox’е), только я не могу понять, почему. :) )

Comment by Yuriy Drozdov
2009-04-13 10:42:30

Сергей, спасибо за Ваш комментарий. Но, если внимательней прочитать статью, то можно заметить эту строчку:

Реализуем это в javascript с помощью jquery.

Она стоит как раз над рабочим примером. К тому же слово jquery является ссылкой на эту javascript библиотеку. Eсли Вы считаете, что это не достаточное объяснение, предложите лучшее. Спасибо.

 
 
Comment by Иванов Сергей Subscribed to comments via email
2009-04-13 18:33:08

Ага… Не заметил, извините. :) Просто с программированием я пока знаком плохо; больше как-то по теории… :)

Вот кросс-браузерный рабочий код, который решает проблему с “наезжанием” текста на изображение - он не такой элегантный, но то, что получается, выглядит и взаимодействует с пользователем совершенно точно также, как обычное поле ввода с изображением, но без наезжания:

———————-
Файл CSS.css:
———————-

.csSeekLabel{
}

.csSeekEncloser{
border : solid 1px #848388 ;
}

.csSeekImage{
border : 0px ;
padding-left : 3px ;
vertical-align : -2px ;
}

.csSeekText{
border : 0px ;
}

———————-
Файл index.html
———————-

//

Введите текст для поиска:

. По-моему, это работает. :)

Почему, правда, работает эта функция jQuery, ‘$’, я так и не понял, :) но вот как, кажется, можно использовать jQuery в JavaScript для создания эквивалента поля ввода с изображением без наезжания текста на изображение при вводе слишком длинного текста.

А статья пригодилась, спасибо.

 

Извините, комментарии закрыты.