О работе с самой библиотекой jQuery написано много, но внятных туториалов по созданию расширений для неё я не видел. А раз так, значит этот туториал исправит ситуацию. Начнём сразу с разбора кода:
var first_plugin_class = function( element , options )
{
this._element = element;
this.init( options );
}
Тут эксплуатируется тот факт, что в JavaScript'е понятие между объектами и типами весьма размыто. Мы можем создать пустой объект, затем динамически добавить ему поля и методы, и в завершение начать использовать его для создания инстансов этого объекта. В примере выше всё несколько забавнее. Мы создали функцию first_plugin_class, добавили ей поле _element и создали вызов функции init (строго говоря именно создали вызов, а не вызвали, т.к. самой вызываемой функции ещё нет). Эта функция как раз и будет нашим типом данных. Здесь element это элемент DOM, которым мы будем оперировать, а options это параметры создания объектов нашего плагина. Теперь нужно определить функцию инициализации:
first_plugin_class.prototype.init = function( options )
{
this._title = options.title;
}
В общем-то всё достаточно незатейливо — просто добавили ещё поле и инициализировали его. Теперь напишем геттер для этого поля:
first_plugin_class.prototype.get_title = function()
{
return( this._title );
}
Всё, можно уже протестировать:
ob = new first_plugin_class( false , { 'title':'Это первый плагин!' } );
document.write( ob.get_title() );
Если все сделано правильно, то этот код выведет строку 'Это первый плагин!' Однако цель не достигнута. Созданный плагин нужно интегрировать в jQuery. Делается это так:
jQuery.fn.first_plugin = function( options )
{
// ...
}
Здесь first_plugin - это фабричная функция, которая будет создавать объекты нашего плагина, для указанных с помощью селекторов элементов DOM. Выглядеть это будет так:
ob = $( '#id1' ).first_plugin( { 'title':'Это первый плагин!' } );
В данном примере создается один объект для одного элемента DOM. А что если $( selector ) вернёт несколько элементов? Мы это обязательно предусмотрим. А пока начнем с подготовки данных:
options = jQuery.extend(
{
title : 'Это дефолтовое значение!'
} ,
options
);
Здесь, если title не задано, то мы присваиваем дефолтовое значение. Теперь создаем объекты:
if( this.length == 0 )
{
result = false;
}
else if( this.length == 1 )
{
result = new first_plugin_class( $( this ) , options );
}
else
{
result = [];
for( i = 0 ; i < this.length ; i++ )
{
result.push( new first_plugin_class( $( this[ i ] ) , options ) );
}
}
return( result );
Всё, теперь сколько бы элементов не выбрали, для всех будет создан объект. Ну если ничего не выбрано, то будет возвращено false. Добавим теперь ещё одну функцию (можно было обойтись и без неё, но чтобы пример совсем уж мелким не был):
first_plugin_class.prototype.attach = function()
{
$( this._element ).html( this.get_title() );
}
Теперь делаем вызов:
ob = $( '#id1' ).first_plugin( { 'title':'Это первый плагин!' } );
ob.attach();
Вуаля!