Создаем jQuery плагин на примере поискового поля

Создаем jQuery плагин на примере поискового поля

Привет!

Сегодня я расскажу о том, как сделать jQuery плагин. А чтобы не делать что-то абстрактное, давайте сделаем вот такой плагин для текстового поля: есть текст по умолчанию и какой-то класс. При фокусе в это поле убирается класс и дефолтный текст, при блюре на нем — если ничего не введено, то текст и класс возвращаются домой. Такие штуки модные парни обычно используют для полей поиска, но они могут пригодиться нам и для других полей.

В программе урока: как делать плагин к jQuery, реализация простого плагина и аналог такого скрипта под Mootools (не все же одно jQuery).

Структура плагина

Для начала посмотрим на общую структуру плагина. Я написал комментарии к каждой строчке, так что смотрим на код:

<script type="text/javascript">
// так вот начинается описание плагина (с названием somePlugin)
(function($) {
$.fn.somePlugin = function(options) {
// значение по умолчанию для опциональных аргументов
// в виде имя: значение
var defaults = {
someOption: 'someValue'
};
// расширяем дефолтные значения опциями
var opts = $.extend(defaults, options);
// они теперь доступны как opts[имя_опции]
// вот тут сам плагин
};
})(jQuery);
</script>

Вызывается плагин следующим образом:

<script type="text/javascript">
$('my_element').somePlugin({
someOption: 'anotherValue'
});
</script>

Ну чтож, более-менее ясно, давайте перейдем к конкретике.

Плагин для текстового поля

В общем, есть у нас какое-то текстовое поле:

<input type="text" id="search-input" name="q" />

Немного стилей для красоты:

#search-input {
font-size: 3em;
width: 15em;
}

// это стиль для неактивного состояния
.inactive {
color: #AAA;
}

Сделать нам нужно вот так:

  1. при загрузке страницы добавить к полю класс для неактивного состояния (.inactive);
  2. поставить дефолтное значение («Поиск»);
  3. при фокусе убирать класс и обнулять значение, если там стоит слово «Поиск»;
  4. при блюре проверяем, если поле пустое или там стоит слово «Поиск», то добавляем класс .inactive и выставляем дефолтное значение.

Вот такая схема. Реализуется она следующим образом (смотрим комментарии в коде):

<script type="text/javascript">
(function($) {
$.fn.inputDefualts = function(options) {
// дефолтные значения
var defaults = {
cl: 'inactive', // имя класса для неактивного состояния
text: this.val() // значение берется из самого инпута
}, opts = $.extend(defaults, options);

this.addClass(opts['cl']); // добавляем класс к инпуту
this.val(opts['text']); // ставим значение по умолчанию

// обрабатываем события фокуса на поле
this.focus(function() {
if($(this).val() == opts['text']) $(this).val(''); // обнуляем его, если надо
$(this).removeClass(opts['cl']); // убираем класс
});

// теперь очередь блюра
this.blur(function() {
if($(this).val() == '') {
$(this).val(opts['text']); // возвращаем значение
$(this).addClass(opts['cl']); // и класс, если надо
}
});
};

})(jQuery);

$(document).ready(function() {

// вызов плагина
$('#search-input').inputDefualts({
cl: 'inactive',
text: 'Поиск'
});
});
</script>

Смотрим Загружаем jQueryЗагружаем Mootools

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 30

Влада
дуже класно написано!!мене це зацікавило!!
omfg
Хорошо написано, понятно для тех кто осваивает.
Еще хотелось бы добавить на будущее - если полей будет много, то лучше немного поправить последний листинг на этот случай, добавив после перечисления дефолтных настроек $(this).each( ... ). Ведь в основном мы манипулируем наборами, а не отдельной формой.
#
omfg
Grin
omfg, но тогда нельзя будет задать опции для каждого поля из набора в отдельности
livetrace
Интересно конечно, но вопрос зачем jQuery, зачем Mootools?
То-же самое, 2-мя строчками обычного кода делается.
Жаль, код в кометах не привести.
PS
Хотя в целом, я обеими руками голосую и за jQuery и за Mootools.

#
livetrace
Grin
livetrace, ты прав насчет обычного js, но в силу тенденций и потребностей веб-приложений сейчас мало кто пишет клиентскую часть на чистом js. Так что наши сниппеты будут только в помощь ;-)
Андрей
В данном случае можно так
function defoultform (t, str) { 
$(t).val(str);
$(t).focus(function () {if ($(this).val()==str) $(this).val("") }); 
$(t).blur(function () {if (trim($(this).val())=="") $(this).val(str) });
}

defoultform ("#milo","Ваш e-mail");


по крайней мере я так делаю =)
aztek
В mootools, чтобы иметь возможность юзать написанный класс в таком виде:
$('search-input').inputDefualts({
    cl: 'inactive',
    text: 'Поиск'
})


необходимо добавить следующее:


Element.implement({
    inputDefaults: function(options){
        return new inputDefualts(this, options);
    }
});
#
aztek  
Grin
aztek, спасибо ;-)
Ksenya
спасибо за дополнительные примеры работы
Александр
Урок интересный! А как сделать чтобы когда пишешь в поле текс, уже выпадали примеру или похожие слова.. как в яше
Роман
onclick="if (this.value=='Поиск'){this.value='';}"

намудрили то....
#
Роман
Роман
value="Поиск" onFocus="this.value=''" onBlur="if (this.value==''){this.value='Поиск'}"
#
Роман
delaf
А в чем прикол? пустая форма без кнопок которая ничего не делает
#
delaf
Grin
Роман, такая привязка событий это прошлый век, к тому же все изменения будут очень неудобными
#
Grin
Grin
delaf, прикол в создании плагина на простом примере
#
Grin
monitoringe
Роман, ваш код подставляет класс для дефолтного значения? Очень часто такое бывает нужно (дефолтное слово типа «поиск» сереньким, если вводишь текст, то он уже чёрным цветом).
#
monitoringe  
Роман
value="Поиск" onFocus="this.value='';this.className='newClass'" onBlur="if (this.value==''){this.value='Поиск';this.className'defaultClass'}"

прошлый век, прошлый век...
в этом веке видимо модно микроскопом гвозди забивать? ))



#
Роман
Роман
className='defaultClass' *
#
Роман
Grin
Роман, в этом веке можно делать так, чтобы было удобно работать ;-)
Смотри, скажем у тебя есть проект с кучей таких полей, который разбросаны по шаблонам. Чтобы что-то поменять в твоей функции (убрать или добавить класс) нужно будет править каждый шаблон. В моем случае нужно поправить пару строчек в одном файле js.
Кроме того, инлайновая привязка событий это плохой тон.
#
Grin
Maddywork
А ведь можно сделать так например когда активно бекграунд другой, когда неактивно другой?
Grin
Maddywork, там же есть изменяющийся класс для активного и неактивного состояния, так что просто пропиши в CSS нужный фон
Евгений
Забавно получается если в инпуте написать "Поиск" :) :)
А вообще, мое мнение что такие штуки неплохо выносить на уровень самой библиотеки. Например, так же как они сделали событие hover.
Влад
Уныло:( Можно спокойно сделать без mootools и jquery.
#
Влад
Elfet
А вот так вот можно пароль оформить:

(function($) {
	$.fn.inputDefualtsPassword = function(options) {
		// дефолтные значения
		var defaults = {
			password: null,
			holder: null,
			cl: 'inactive', // имя класса для неактивного состояния
			text: this.val()   // значение берется из самого инпута
		}, 	opts = $.extend(defaults, options);	
		
		this.addClass(opts['cl']); 	// добавляем класс к инпуту
		this.val(opts['text']);			// ставим значение по умолчанию
		opts.holder = this;
		
		// обрабатываем события фокуса на поле
		this.focus(function() {
			$(opts.password).show().focus();
			$(this).hide();
		});
		
		// теперь очередь блюра
		$(opts.password).blur(function() {
			if($(opts.password).val() == '') {
			    	opts.holder.show();
				$(this).hide();
			}
		});
	};	
	
})(jQuery);

........

$("#passwordholder").inputDefualtsPassword({password: '#password', cl: 'inactive', text: 'Пароль'});

........

<input type="text" name="free" id="passwordholder" value="">
<input type="password" name="password" id="password" value="" style="display: none;">
#
Elfet
Жек
Это если вы не поняли не пример создания конкретоного текстового поля а пример создания корректного плангина для jq или mootols. Функционал возможен любой, просто чтобы вам было понятнее здесь описана простая процедура.
#
Жек
Александр
В код закралась опечато4ка (3-я строка):
...
$.fn.inputDefaults = ...

Кстати, спасибо за полезную статью :)
а как ?
Как можно это к шаблону привязать 7
#
а как ?
dimasokol
defaultValue надо юзать вместо захардкоденной строки "Поиск".
#
dimasokol
heavy
минус такого подхода, что перед постом или проверкой формы - нужно дополнительно проверять и очищать подсказку :)
#
heavy
Светлана
Зачетный скрипт! Забрала себе.

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
counter strike mt2 silkroad pvp metin2 metin2 pvp knight pvp gm olarak başlayan pvpler pvp silkroad pvp serverler counter strike serverler msn show cam show görüntülü sohbet oyunlar suskunlar gazete oku