Статьи

Сделайте свой код MooTools короче, быстрее и сильнее

Дважды в месяц мы возвращаемся к любимым постам наших читателей на протяжении всей истории Nettuts +. Этот учебник был впервые опубликован в феврале 2010 года.

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


Одним из больших преимуществ использования MooTools является то, что он невероятно модульный. Что это обозначает? Почти ничего не требуется, если вам это не нужно. Преимущество модульности MooTools заключается в том, что ваша ограниченная пользовательская сборка MooTools может сократить время загрузки JavaScript.

Хотите создать собственную сборку MooTools для вашего следующего проекта? Следуй этим шагам:

  • Зайдите на http://mootools.net/core (и / или http://mootools.net/more, если вы хотите дополнительные плагины)
  • Выберите плагины по вашему выбору. Не беспокойтесь об учете зависимостей — разработчик плагинов сделает это за вас!
  • Выберите вариант сжатия по вашему выбору — YUI Compressor предоставит вам наименьшую возможную сборку MooTools

Это оно! Однако иногда вашему проекту требуется вся библиотека MooTools Core. В этом случае ваш сайт может сэкономить тысячи
запросов в день с помощью библиотек Google AJAX завершить сборку MooTools. Вы можете сделать это двумя способами:

Этот первый метод просто включает MooTools на страницу в обычном режиме. Второй метод обеспечивает большую функциональность и производительность:

1
2
3
4
<script src=»http://www.google.com/jsapi»></script>
<script type=»text/javascript»>
google.load(«mootools», «1.2.4»);
</script>

Преимущество использования API библиотек Google AJAX заключается в том, что если другой веб-сайт использует API библиотек AJAX, эта версия MooTools уже кэшируется в их браузере, и сайт будет загружаться быстрее!


Хотя лучше придерживаться одной библиотеки на данной странице, чтобы избежать лишних затрат, иногда вам не избежать множества фреймворков.
К счастью, MooTools может сосуществовать с любыми JavaScript-инфраструктурами, не основанными на прототипах. Вот как вы можете использовать jQuery и MooTools на одной странице:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<!— jquery gets the «$» method —>
<script type=»text/javascript» src=»jquery-1.4.js» />
<!— mootools doesn’t steal the «$» method;
<script type=»text/javascript» src=»mootools.js» />
<!— let’s use them —>
<script type=»text/javascript»>
//with jquery, grab all links, make then red
$(‘a’).css(‘color’,’red’);
//with mootools, get the content div, set it’s background color to pink
document.id(‘content’).setStyle(‘background’,’pink’);
//with mootools, get the content div, set it’s background color to pink
//this time, we’ll give mootools the «$» method
(function($) {
    $(‘content’).setStyle(‘background’,’pink’);
})(document.id);
</script>

Благодаря долларовому безопасному режиму MooTools, MooTools больше не использует метод «$», если он уже используется!


Разработчикам часто нужно собирать один элемент или набор элементов. Например, вам может понадобиться захватить все элементы А на странице, изменить их цвет и создать из них всплывающие подсказки.

Код выше крайне неэффективен. Зачем запрашивать DOM дважды (с $$), если вы можете собрать все элементы один раз? Давайте сделаем это более эффективным:

Вы можете сделать это еще короче, но это не так легко читается:

Читаемость важна, поэтому я бы не советовал кодировать таким образом, если вы работаете с командой.


Циклический просмотр массива элементов не является уникальным для любой платформы JavaScript:

Многие разработчики не знают, что в коллекциях Element используются те же методы, что и в Elements, поэтому не нужно их циклически проходить — просто примените желаемую функциональность к коллекции:

Обратите внимание, что ключевое слово «this» используется для ссылки на текущий элемент в коллекции, а не на саму коллекцию.


Метод «псевдоним» MooTools позволяет переименовывать или псевдоним существующего метода. Возьмите следующий фрагмент кода, который в настоящее время находится в исходном коде MooTools Core:

Приведенный выше код позволяет вам вызывать each метод вместо forEach . Использование each них более читабельно, тихий стандарт между большинством JavaScript-фреймворков, и даже экономит несколько байт в вашем коде. Если вы предпочитаете давать собственные методы MooTools ‘Native или Class’, не стесняйтесь!

Например, метод Element Class для удаления элемента из DOM:

Предположим, что ваше веб-приложение посвящено определенной теме, и вы хотите придерживаться этой терминологии для своего кода. Вот несколько примеров:

Какими бы ни были ваши причины для вызова метода с другим именем, просто не бойтесь этого делать!


Доступ к коллекции элементов в DOM является основной обязанностью любой платформы JavaScript. К сожалению, это также может облагать налогом, и требуемые псевдо-селекторы не всегда доступны. К счастью, MooTools позволяет легко реализовать ваши собственные псевдо-селекторы! Давайте
создайте псевдоселектор с именем «disabled», который возвращает элемент, если он отключен.

Просто добавьте ваш селектор в объект Selectors.Pseudo. Если новая псевдо-функция возвращает «истина», элемент соответствует и будет возвращен.

Определение ваших собственных псевдо-селекторов — отличный способ контролировать ваши селекторы!


Философия MooTools заключается в том, что допустимо и даже рекомендуется модифицировать собственные прототипы (String, Function, Number и т. Д.), Когда это необходимо.
Внедрение новых методов на этих аборигенах даст им еще больше возможностей. Давайте создадим метод String, который превратит любую строку текста в
Формат «твит» (добавьте ссылки для @ reply, ссылок и т. д.):

Теперь вы можете вызвать «toTweet» для любой строки, и вы получите строку обратно как «твит». Вот несколько примеров:

Реализация пользовательских методов на объектах усиливает каждый существующий и будущий экземпляр этого объекта.


Философия ООП MooTools предусматривает сверхмощную модель наследования. Расширение существующих классов позволяет избежать повторения кода, расширить возможности существующих объектов и использовать существующие функциональные возможности. MooTools Core, More и ваши пользовательские классы расширяют существующие функциональные возможности. Рассмотрим класс Request :

Затем рассмотрим Request.JSONP, который расширяет Request:

Вы видите, насколько мал класс Request.JSONP ? При добавлении Extends: Request класс Request.JSONP получает все методы класса запросов. По сути, этот небольшой фрагмент кода становится мощным, потому что он расширяет Request . Вы даже можете добавить расширения к расширениям. Теперь рассмотрим Request.JSONP а затем класс Request.Twitter Скотта Кайла :

… и теперь Request.Twitter:

Вы видите, как эффект водопада от расширения объектов может сделать самых маленьких классов абсолютным зверем в классе?
Поэкспериментируйте с моделью наследования MooTools и не повторяйте код!


Я уже объяснил, насколько гибок механизм выбора MooTools, система классов и насколько модульна структура. 1 Почему вы ожидаете чего-то отличного от системы событий MooTools? Создание пользовательских событий в MooTools настолько просто, насколько это возможно. Вот основная схема вашего пользовательского события MooTools:

Вот отличный пример пользовательского события — прослушивание «alt» и «click» одновременно:

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

Вы заметите, что если событие click удаляется, оригинальный курсор будет восстановлен.


Хотя синтаксис события MooTools отличается от синтаксиса jQuery, это не обязательно должно быть! С минимальным количеством JavaScript вы можете сделать так, чтобы синтаксис событий MooTools отражал jQuery.

MooTools хранит все свои события в объекте Element.NativeElements :

По сути, все, что вам нужно сделать, — это циклически проходить по каждому типу элемента и реализовывать метод класса Element, называемый как тип события
это имитирует то, что делает addEvent:

Теперь вы можете слушать такие события, как:


Если у вас есть опыт программирования с MooTools, в какой-то момент вы, без сомнения, создали элемент и впоследствии добавили к нему события:

Можно сказать, что в этом нет ничего плохого, но вы можете просто добавить эти события во время создания элемента:


Продление классов обсуждалось в совете № 8 выше. Теперь давайте рассмотрим функциональность * реализовать * в классах MooTools. Какая разница? Участник MooTools Марк Обцена лучше всех говорит в своей статье под названием « The Moo Herd IV: для этого есть класс» :

MooTools имеет два встроенных мутатора: Расширяет и Реализует. Мутатор Extends берет переданное ему имя класса и заставляет новый класс наследовать непосредственно от него, в то время как Implements принимает переданный класс (или классы) и добавляет свои методы в новый класс (или смешивает их — таким образом, mixin).

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

Конечно, класс делает то, что должен, но это не так гибко, как могло бы быть. Теперь давайте реализуем события onClick, onClose, onHide, onOpen и onShow:

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

… и ниже, где бы вы ни хотели, чтобы событие было сигнализировано …

Итак, как вы можете контролировать эти события при создании экземпляра класса? Добавьте их в опции, как это:

Вам будет трудно найти класс, который не получит пользу от реализации событий!


Делегирование событий — это процесс добавления события к родителю для всех его дочерних элементов вместо назначения события каждому отдельному дочернему элементу. Преимущество делегирования события заключается в том, что вы можете добавить дочерние элементы к родительскому элементу, не назначая событие этому новому элементу. Если вы решили удалить событие, вам нужно только удалить его из одного элемента.

Итак, вместо:

…ты делаешь это:

Не позволяйте псевдосинтаксису «: relay ()» одурачить вас; Element.Delegation переписывает методы события для: relay.


Одним из скрытых камней в классе MooTools является метод Class.toElement. Class.toElement играет небольшую роль, но может помочь вам, когда дело доходит до доступа к первичному элементу в классе, особенно если вы не знаете, что это за элемент в противном случае. Реализовать toElement в вашем классе легко:

Как только вы определили toElement, вы можете использовать свой класс как элемент:

Посмотрите на это — класс, фактически управляемый методами Element.


Итак, мы все видели, как JavaScript-фреймворки позволяют вам чертовски цеплять методы. Цепочка выглядит так:

Святая цепочка Бэтмен! Хотите, чтобы ваши классы цеплялись всегда? Нет проблем — все, что вам нужно сделать, это вернуть « this »:

Так как вы поместили return this в каждом методе, теперь вы можете сделать:

Обязательно возвращайте this везде, где это имеет смысл. Это может значительно облегчить работу с вашим Class и ваш код будет короче!


MooTools эффекты неоспоримо самый мягкий из любых рамок JavaScript. Библиотека Fx также предоставляет множество возможностей управления через многочисленные опции. Давайте посмотрим на базовую анимацию, которая увядает элемент до 50%:

Знаете ли вы, что вам не нужно было печатать все это? Вы можете использовать ярлыки элементов, такие как:

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

Сохраните себя несколько байтов, используя Fx ярлыки!


Надеюсь, я дал вам несколько советов, как улучшить код JavaScript MooTools, сделать его короче, быстрее и эффективнее. Есть какие-то свои собственные советы, чтобы поделиться? Разместите их в комментариях ниже!