Первый плагин

Комом...

Для начала давайте вспомним, для чего нам нужны плагины? Мой ответ — для создания повторно используемого кода, причём с удобным интерфейсом. Давайте напишем такой код, начнём с простой задачки:

— По клику на параграф текст должен измениться на красный

JavaScript и даже не jQuery

Дабы не забывать истоки, начнём с реализации на нативном JavaScript:

// завернём всё в функцию
let loader = function () {
  // находим все параграфы
  let paragraphs = document.getElementsByTagName('P');
  // перебираем всё и вешаем обработчик
  for (let i = 0; i < paragraphs.length; i++) {
    // собственно обработчик
    paragraphs[i].onclick = function() {
      this.style.color = "#FF0000";
    }
  }
}

// естественно, весь код должен работать после загрузки всей страницы
document.addEventListener("DOMContentLoaded", loader);

Данный код не является универсальным и написан с целью лишний раз подчеркнуть удобство использования jQuery ;)

jQuery, но ещё не плагин

Теперь можно этот код упростить, подключаем jQuery и получаем следующий вариант:

Таки jQuery-плагин

С поставленной задачей мы справились, но где тут повторное использование кода? Или если нам надо не в красный, а в зеленый перекрасить? Вот тут начинается самое интересное. Чтобы написать простой плагин, достаточно расширить объект $.fn:

Если же писать более грамотно, то нам необходимо ограничить переменную $ только нашим плагином, а также возвращать this, чтобы можно было использовать цепочки вызовов (т.н. «chaining»). Делается это следующим образом:

Внесу небольшое пояснение о происходящей тут «магии». Код (function($){…})(jQuery) создает анонимную функцию и тут же вызывает её, передавая в качестве параметра объект jQuery. Таким образом внутри анонимной функции мы можем использовать алиас $, не боясь за конфликты с другими библиотеками, так как теперь $ находится лишь в области видимости нашей функции и мы имеем полный контроль над ней. Если у вас возникло ощущение дежавю – то всё верно, я об этом уже рассказывал.

Добавим опцию по выбору цвета и получим рабочий плагин:

Вызов:

В результате работы данного плагина каждый клик будет изменять цвет параграфа на красный. Та как мы используем глобальную переменную для хранения настроек, то второй вызов плагина изменит значение для всех элементов:

Можно внести небольшие изменения и разделить настройки для каждого вызова:

А разница-то в одном «var». Мне даже сложно себе представить, как много часов убито в поисках потерянного «var» в JavaScript. Будьте внимательны:

Работаем с коллекциями объектов

Тут всё просто, достаточно запомнить — this содержит jQuery-объект с коллекцией всех элементов, т.е.:

Если мы хотим обрабатывать каждый элемент, то соорудим следующую конструкцию внутри нашего плагина:

Публичные методы

Так, у нас написан «крутой» плагин, надо бы ему ещё докрутить функционала – пусть цвет регулируется несколькими кнопками на сайте. Для этого нам понадобится некий метод color, который и будет в ответе за всё. Сейчас приведу пример кода готового плагина — будем курить вместе (обращайте внимание на комментарии):

Теперь ещё небольшой пример использования данных методов:

Для понимания данного кусочка кода вы должны разобраться лишь с переменной arguments и методом apply(). Тут им целые статьи посвятили, дерзайте:

Об обработчиках событий

Если ваш плагин вешает какой-либо обработчик, то лучше всего (читай – всегда) данный обработчик повесить в своём собственном namespace:

Данный финт позволит в любой момент убрать все ваши обработчики или вызвать только ваш, что очень удобно:

— Дежавю? Ок!

Дам ещё чуток информации к размышлению, но на английском:

Essential jQuery Plugin Patterns

На этом об обычных плагинах всё. Всем спасибо за внимание.

Last updated