Создаем 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>
разрешенные теги или посмотреть как будет выглядеть

metin2 pvp metin2 pvp serverler pvp serverler