Пишем свой widget
Отправной точкой при написании виджета для jQuery UI для вас будет официальная документация, но поскольку со знанием английского не у всех сложилось, то я постараюсь перевести и адаптировать информацию, изложенную в ней.
Первое, о чём стоит рассказать, это то, что правила написания плагинов для jQuery слишком вальяжны, что не способствует их качеству. При создании jQuery UI, походу, решили пойти путём стандартизации процесса написания плагинов и виджетов. Я не могу сказать насколько задумка удалась, но стало явно лучше чем было. Начну с описания каркаса для вашего виджета:
Поясню для тех, кто не прочёл комментарии:
| хранилище настроек виджета для конкретного элемента |
| отвечает за инициализацию виджета – тут в DOM должны происходить изменения и «вешаться» обработчики событий |
| антипод для |
| данный метод будет вызван при попытке изменить какие-либо настройки: |
Наблюдательный глаз заметит, что все перечисленные методы начинаются со знака подчёркивания – это такой способ выделить «приватные» методы, которые недоступны для запуска. Если мы попытаемся запустить $('#my').expose('_destroy')
, то получим ошибку. Но учтите – это лишь договорённость, соблюдайте, её!
Для обхода договорённости о приватности можно использовать метод data()
:
В данном примере я постарался задать хороший тон написания виджетов – я «повесил» обработчики событий в namespace
. Это даст в дальнейшем возможность контролировать происходящее без необходимости лазить в код виджета. «True story».
Код, описанный в методе
_destroy()
, избыточен, т.к. он и так выполняется в публичномdestroy()
. Приведён тут для наглядности.
А для ленивых, чтобы не прописывать каждый раз eventNamespace
в обработчиках событий, разработчики добавили в версии 1.9.0 два метода: _on()
и _off()
. Первый принимает два параметра:
DOM-элемент, или селектор, или jQuery-объект
набор обработчиков событий в виде объекта
Все перечисленные события будут «висеть» в пространстве eventNamespace
, т.е. результат будет предположительно одинаковым:
Второй метод, _off()
, позволяет выборочно отключать обработчики:
Ну, каркас баркасом, пора переходить к функционалу. Добавим произвольную функцию с произвольным функционалом:
К данной функции мы легко сможем обращаться как из других методов виджета, так и извне:
Если ваша функция принимает параметры, то передача оных осуществляется следующим способом:
Если вы хотите достучаться в обработчике событий до метода виджета, то не забудьте про область видимости переменных и сделайте следующий манёвр:
Хорошо идём, теперь поговорим о событиях. Для более гибкой разработки и внедрения виджетов предусмотрен функционал по созданию произвольных событий и их «прослушиванию»:
Материала много, я понимаю, но ещё добавлю описание нескольких методов, которые можно вызвать из самого виджета:
_delay()
– данная функция работает как setTimeout()
, вот только контекст переданной функции будет указывать на сам виджет (это чтобы не заморачиваться с областью видимости)
_hoverable()
и _focusable()
– данным методам необходимо скармливать элементы, для которых необходимо отслеживать события hover
и focus
, чтобы автоматически добавить к ним классы ui-state-hover
и ui-state-focus
при наступлении оных
_hide()
и _show()
– эти два метода появились в версии 1.9.0, они созданы дабы стандартизировать поведение виджетов при использовании методов анимации; настройки принято прятать в опциях под ключами «hide» и «show» соответственно. Использовать методы следует следующим образом:
Существует ещё пара методов, которые реализованы до нас:
Фактически, данные функции создают синоним для вызова:
Наша задача сводится лишь к отслеживанию этого флага в методе _setOption()
.
Возможно, этот виджет и не будет популярен, зато он наглядно демонстрирует, как создавать виджеты для jQuery UI:
Будьте внимательны, с выходом jQuery UI версии 1.9.0 были внесены правки в Widget API, следовательно, большинство доступной информации устарело, так что читайте официальную документацию. А ещё лучше – заглядывайте в код готовых виджетов «от производителя».
Информация по теме разработки виджетов:
Last updated