Mootools для начинающих, урок №1

15 апреля 2009, 1:51 Павел Марковнин JavaScript рейтинг +34-

Mootools для начинающихВсем привет!

Сегодня мы начнем знакомство с довольно популярным js-фреймворком Mootools. Этот фреймворк довольно компактный, модульный (то есть можно не угрузить ненужный код) и объектно-ориентированный.

Mootools считается более «программерским» фреймворком (соответственно, jQuery — дизайнерским). Однако и тот, и другой имеют ряд преимуществ и очень удобны в работе. Вот только о jQuery мы говорили с самого начала, а Mootools до этого не затрагивали. Надо исправить недоразумение ;-)

Итак, сегодня мы научимся получать элементы DOM, манипулировать свойствами (стилями и классами) и применять события к этим элементам. В конце будет небольшой пример, как связать это все воедино.

Подключение

Для начала идем на страницу загрузки фреймворка и качаем сжатый файл (всего 63 КБ). Сейчас мы загрузили полное ядро фреймворка, но в дальнейшем вы можете загружать только необходимые модули.

Теперь подключаем файл к странице, скажем в хедер:

<html>
<head>
<title>MooTools начинающих</title>
<script type="text/javascript" src="mootools.js"></script>
</head>
<body>

</body>
</html>

Получение DOM элементов

Для того, чтобы получить элемент по его id, необходимо сделать следующее:

var myElement = $('elementId');

А чтобы получить все элементы с каким-то классом, можно сделать вот так:

var myElements = $$('.elementsClassName'); //  в итоге получим массив

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

$$('#myWrapper a') // все <a> внутри элемента с id="myWrapper"
$$('img[alt=^Image]') // все картинки, alt которых начинается с Image
$$(myelement1, 'a', '#myid', document.getElementsByTagName('div')); // массив этих элементов

Манипулирование классами и свойствами

Ну что, получать элементы уже умеем, теперь давайте посмотрим, как управлять классами и другими аттрибутами элементов. Рассмотрим, что мы можем делать с классом элемента:

myElement.addClass('test-class'); // добавляет класс к элементу
myElement.removeClass('test-class'); // убирает класс у элемента
myElement.hasClass('test-class'); // проверяет, есть ли такой класс у элемента
myElement.toggleClass('test-class'); // если есть класс, убирает его, в противном случае добавляет

Для получения какого-либо аттрибута элемента можно использовать функции get('attr'), getProperty('attr') или getProperties('attr1', 'attr2', ...) (последняя возвращает ассоциативный массив значений). Соответственно, для установки аттрибута используем set('attr', 'val'), setProperty('attr', 'val') и setProperties({attr1: val1, attr2: val2}).

Рассмотрим пример. Допустим у вас есть две картинки и вы хотите взять значение alt у первой и поставить его в alt второй:

<img src="img1.png" alt="Картинка №1" id="img1" />
<img src="img2.png" alt="Картинка №2" id="img2" />

<script type="text/javascript">
$('img2').set('alt', $('img1').getProperty('alt'));
</script>

Привязка событий

Привязка события осуществляется функцией addEvent(). Ее первый аргумент — тип события, второй — фунция, которая будет выполняться при этом событие на этом элементе.

Например, для того, чтобы выполнить какую-то функцию сразу после загрузки DOM, нужно написать вот так:

document.addEvent('domready', function() {
myFuntion();
});

А если вы хотите, чтобы при клике на ссылку выполнялась какая-то функция, то сделать это можно вот так:

<a href="/" id="my-link">ссылочко</a>  
<script type="text/javascript">
document.addEvent('domready', function() {
$('my-link').addEvent('click', function(event) {
event.preventDefault(); // отменяем стандартное действие при клике, чтобы не было перехода по ссылке
myFunction();
});
});
</script>

Пример

За первый урок мы научились получать элементы DOM, манипулировать их классами и аттрибутами, и привязывать события. Для закрепления материалы предлагаю реализовать простой пример: у нас есть группа объектов, при клике на какой-то один из них, он выделяется, а остальные остаются одинаковыми. Плюс к этому, при наведении на каждый элемент, он тоже как-то выделяется.

Для начала сделаем html. Пусть в качестве элементов будут элементы списка:

<ul id="my-list">
<li>Первый</li>
<li>Второй</li>
<li>Третий</li>
<li>Четвертый</li>
<li>Пятый</li>
</ul>

Теперь черед CSS. Ага, один момент. Мы, конечно, могли бы как-нибудь выделить элемент прямо из JS, прописав ему, к примеру, жирность и фон, но, как все модные парни, мы помним о прогрессивном улучшении и не будет мешать программную логику и оформление. Так что придумаем класс для выделенного элемента:

li.selected {
background: #D50303;
color: #FFF;
font-weight: bold;
}

Теперь самое интересное, JavaScript:

document.addEvent('domready', function () {
var lis = $$('#my-list li'); // получаем все необходимые элементы

// когда курсор на объектом — приписываем ему класс, когда нет — убираем
lis.addEvent('mouseover', function () {
this.addClass('hover');
});
lis.addEvent('mouseout', function () {
this.removeClass('hover');
});

// действие при клике
lis.addEvent('click', function () {
lis.removeClass('selected'); // убираем у всеъ элементов класс 'selected'
this.addClass('selected'); // к тому, по которому кликнули, приписываем
});
});

Все готово, смотрим:

Пример Архив урока

Рекламное место, которое может стать вашим

Понравилась статья?

Тогда подпишись на обновления через RSS или воспользуйся
другими способами подписки.

Читать в Яндекс.Ленте Добавить в Google Добавить в Netvibes
  •  

Комментарии — 20

RSS
  • Аватарка
    15 апреля 2009 в 4:30 ]]>Алик Кириллович]]>
    >аргументом оператора $$() может быть как любой CSS селектор, так и массив элементов:
    $$(myelement1, "a", "#myid", document.getElementsByTagName("div")); // массив этих элементов

    Здесь, все-таки, используется не массив элементов, а переменное число аргументов.

    Массив элементов выглядел бы так:
    $$([myelement1, "a", "#myid", document.getElementsByTagName("div")]);


    Конечно, для доступа к этим аргументам используется массив arguments, но это происходит внутри функции, а не при ее вызове.
  • Аватарка
    15 апреля 2009 в 10:41 ]]>Grin]]>
    Спасибо, Алик, так будет правильнее.
  • Аватарка
    15 апреля 2009 в 10:59 ]]>adw0rd]]>
    Синтаксис похож на тот же jQuery, кроме ф-ии $$

    Подскажите лучше js-фреймворк с синтаксисом селектора как у XPath?
  • Аватарка
    15 апреля 2009 в 11:02 ]]>Grin]]>
    > Подскажите лучше js-фреймворк с синтаксисом селектора как у XPath?
    Насколько я знаю, jQuery поддерживает такие селекторы
  • Аватарка
    15 апреля 2009 в 11:49 Влад
    Фильтрация тегов...
  • Аватарка
    15 апреля 2009 в 11:50 Влад
    что-то вообще всё съехало...
  • Аватарка
    15 апреля 2009 в 11:59 ]]>Grin]]>
    Влад, да, у меня тут есть некоторые баги с тегами (
    Ваш «пустой» коммент я удалил
  • Аватарка
    21 апреля 2009 в 6:18 grejjo
    Госпада, у вас код в iphohe обрезается, читать невозможно.
  • Аватарка
    21 апреля 2009 в 14:09 ]]>Grin]]>
    grejjo, что значит обрезается?
  • Аватарка
    21 апреля 2009 в 17:23 grejjo
    to Grin:
    Очень часто читаю ваш блог, с iPhona. Обрезаются кодовые вставки (примеры написания кода), т.е не появляется горизонтальная полоса прокрутки. Нет в планах оптимизанции под малодюймовые девайсы?
  • Аватарка
    21 апреля 2009 в 21:09 ]]>Grin]]>
    grejjo, да, есть, сейчас закончим с новым разделом и займемся
  • Аватарка
    22 мая 2009 в 2:28 Василий
    нужна ваша помощь , прочитав Вашую статью попробовал реализовать у себя данную технологию, все получилось менюшки выделяет вот только по ссылкам не переход (((

    подскажите пжл как можно побороть данную проблему.



    Главная
    О нас...
    Сервисы
    Резюме
    Блог
    Контакты



    document.addEvent('domready', function () {
    var lis = $$('.menu li a');

    lis.addEvent('mouseover', function () {
    this.addClass('hover');
    });
    lis.addEvent('mouseout', function () {
    this.removeClass('hover');
    });
    lis.addEvent('click', function (event) {
    event.preventDefault();

    lis.removeClass('current');
    this.addClass('current');
    });
    });
  • Аватарка
    22 мая 2009 в 9:39 ]]>Grin]]>
    Василий, убери вот эту строчку
    event.preventDefault();
    Она отменяет стандартное действие при клике на ссылку (как раз переход).
  • Аватарка
    23 мая 2009 в 3:30 Василий
    спс, только наверное не получится сделать так, потому как убрать я убрал эту строку но теперь нажатие срабатывает но класс 'current' срабатывает как то быстро и только видно его действие секунду , а мне нужно что он применялся на следующей странице.

    применил пхп только оно помогло ))
    видимо так как я сделал перезагрузку страници мне яваскрипт не поможет.
    или я не прав ?
  • Аватарка
    30 июля 2009 в 10:34 Mihail_Nik
    Спасибо за статью. У меня вопрос: я написал скрипт как у вас в примере с атрибутом alt для картинки, и заметил что если скрипт поставить перед картинкой то он перестает работать. Могли бы вы объяснить причину.
  • Аватарка
    6 февраля в 17:01 ]]>Flip:Who?]]>
    Неплохо, доступно.
  • Аватарка
    6 февраля в 17:03 ]]>Flip:Who?]]>
    2Mihail_Nik

    На сколько знаю я, то Мутулз срабатывает после загрузки всей страницы и соответственно, проверка параметров должна быть после их установки :)
    Пример на пальцах: у тебя ЕСТЬ 2 яблока. У тебя 2 яблока?)))
  • Аватарка
    6 февраля в 17:33 ]]>Grin]]>
    Flip:Who?, все зависит от того, как вы вызываете свои функции и где вы подклачаете скрипты
  • Аватарка
    6 марта в 19:05 LossBull
    Что-то event.preventDefault(); не работает в ие-6, но там работает ретурн фэлс, который в свою очередь не работает в Опере. Не работает - тоесть идет перезагрузка.
  • Аватарка
    29 августа в 11:05 ]]>Алексей]]>
    Спасибо за урок для начинающих.
  • Эл. почта (используется для Граватарки)
  • Домашняя страница
  • Имя в Твиттере
  • Разрешенные теги Текст сообщения (надо бы заполнить это поле)
  • как выглядит какой тег
    жирный текст <b>жирный текст</b>
    курсивный тект <i>курсивный тект</i>
    зачеркнутый текст <s>зачеркнутый текст</s>
    подчеркнутый текст <u>подчеркнутый текст</u>
    ссылка <a href="адрес">ссылка</a>
    function foo() { ... }
    <pre><code>function foo() { ... } </code></pre>