690
 

Mootools для начинающих – работа с элементами и событиями

Этот туториал предназначен для тех, кто делает первые шаги в изучении библиотеки Mootools. Здесь я рассмотрю две основные задачи, без которых практически не обходится ни один скрипт – это получение ссылок на элементы документа и добавление обработчиков событий к ним.

Получение ссылок на элементы

Для того, чтобы каким либо образом работать с элементами на странице, нужно получить на них ссылку. Для этого в Mootools существуют две основные функции – $() и $$(), при помощи которых можно получать элементы по id, классу, тегу или css селектору. Функция $() является аналогом стандартной document.getElementById() и предназначена для получения элементов по их ID. При помощи второй функции – $$() можно получить ссылки на несколько объектов сразу, передав ей в качестве аргумента один или несколько CSS селекторов. Следующий пример показывает получение ссылок на все элементы с классом someClass и все изображения (тег <img>), а также получение элемента по ID:

// получение элемента по ID
var elem = $('myElement');

// получение элементов по классу
var elems = $$('.someClass');

// получение элементов по тегу
var elems = $$('img');

Функция $$() всегда возвращает массив элементов, следовательно к элементам этого массива можно обращаться при помощи индекса, например так: $$(’li’)[2]. В следующем примере, мы задаем для этой функции сразу три селектора. В результате функция вернет все ссылки, элемент с id=”menu” и элементы списка с классом “alt”:

var aElem = $$('a', '#menu', 'li.alt');

Обе вышеперечисленные функции производят поиск по всему документу. Однако, если нам нужно выбрать некоторые элементы внутри другого элемента, то нужно воспользоваться функциями $E() или $ES(), которые могут принимать второй аргумент – фильтр. Разница между ними лишь в том, что $E() возвращает один элемент, а $ES() – все, соответствующие селектору внутри указанного элемента:

// возвращает первую ссылку внутри элемента DOM с id = 'myElement'
$E('a', 'myElement');

// получение всех ссылок внутри $('myElement')
$ES('a','myElement');


Создание и добавление элементов в DOM.

Новые элементы создаются при помощи класса Element:

var myImg = new Element ( 'img' , { 'src' : 'aa.jpg', 'alt': 'Мое фото' }) ;

Первый аргумент это имя тега, а второй это список аргументов в виде объекта. В этом примере мы создали новый элемент <img>, с двумя атрибутами – src и alt. Помимо прочего, во второй аргумент можно передавать специальные атрибуты styles и events, для установки стилей и обработчиков событий для создаваемого элемента:

new Element('a', {
	'styles': {
		'display': 'block',
		'border': '1px solid black'
	},
	'events': {
		'click': function(){
			//aaa
		},
		'mousedown': function(){
			//aaa
		}
	},
	'class': 'myClassSuperClass',
	'href': 'http://mad4milk.net'
});

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

  • injectBefore(element); – вставляет новый элемент перед элементом element.
  • injectAfter(element); – вставляет новый элемент после элемента element.
  • injectInside(element); – добавляет новый элемент в элемент element. Новый элемент будет последним в списке дочерних (эта функция аналог стандартной appendChild).
  • injectTop(element); – добавляет новый элемент в элемент element. Новый элемент будет первым в списке дочерних.

В качестве примера, покажу создание элемента и добавление в документ с использованием injectBefore(), остальные функции работают похожим образом:

// создаем элемент
var myImg = new Element ( 'img' , { 'src' : 'aa.jpg', 'alt': 'Мое фото' }) ;

// добавляем его в документ перед элементом с id="main"
myImg.injectBefore($('main'));

В этом примере сначала создается изображение с двумя атрибутами – src и alt, а затем оно добавляется перед элементом с id=”main”.

Добавление обработчиков событий

В Mootools, обработчики событий, или вернее сказать “слушатели” (listeners), добавляются к элементам при помощи функции addEvent(), которая имеет следующий синтаксис:

element.addEvent(event, function);

Здесь element – элемент DOM, к которому нужно добавить обработчик, event – тип события без приставки ‘on’ (’click’, ‘load’), function – функция или указатель на функцию, которая должна выполняться при возникновении события. Пример:

$('myElement').addEvent('click', function() {alert('test');} );

// fTest - указатель на функцию
$('myElement').addEvent('click', fTest);

function fTest () {
	alert('test');
}

Поскольку addEvent использует слушатели событий, то к элементам можно добавлять одновременно несколько функций обработчиков. Особое внимание стоит уделить событию onload. Оно возникает при полной загрузке страницы, включая все изображения и флэшки. Это значит, что прежде, чем функция обработчик выполнится, пользователю прийдется ждать пока загрузится все изображения, хотя структура DOM уже полностью готова к работе, и если на сайте большое количество различной графики, то ожидание может затянуться надолго. Для исправления этой ситуации, в Mootools существует событие domready, которое вызывается сразу же после загрузки структуры документа:

window.addEvent('domready', function(){ ... });



Пример

В качестве примера создадим простой HTML документ с меню, выполненным в виде маркированного списка. Затем, получив ссылки на элементы меню, добавим к ним простой обработчик. Структура меню выглядит следующим образом:

<div id="accordion">
	<h3 class="toggler menusection">Меню</h3>
	<div class="element menusection">
		<ul>
			<li>Link 1</li>
			<li>Link 2</li>
			<li>Link 3</li>
			<li>Link 4</li>
		</ul>
	</div>
</div>

Код JavaScript:

window.addEvent('domready', function(){
	$ES('li','accordion').addEvent('click', newItem);
});

function newItem() {
	var el = new Element('li', {
			'events' : {'click' : newItem}
	});
	el.setHTML('Link');
	el.injectInside($E('ul','accordion'));
}

Вначале, мы добавляем обработчик к событию domready объекта window. Этот обработчик получает все элементы <li> внутри элемента с id=accordion и в свою очередь добавляет обработчик newItem к событию onclick. В результате, при щелчке на любом элементе маркированного списка, будет вызываться функция newItem(), которая создает новый элемент <li> и добавляет его в этот же список.

смотреть демоскачать

Добавить в закладки:
Maklay.com - Большой каталог товаров для спорта и активного отдыха

Комментарии на “Mootools для начинающих – работа с элементами и событиями”

  1. [...] – всего 2KРабота с классами в MootoolsВ одной из прошлых статей я писал об основах программирования с использованием [...]

  2. Статья именно то, что нужно человеку, который незнаком с Mootools. Коротко и без перенасыщения фактами. Уверен, эта библиотека имеет еще много полезных функций, но для первого раза достаточно и этого.

  3. Большое спасибо! Теперь буду не только по наитию делать, но и понимать что делаю)

  4. Статья действительно очень полезная. Как букварь – прочитал один раз и на всю жизнь запомнил.Спасибо.

  5. Пытаюсь разобраться с кодом JS который подгружает страничку и и отображает в модальном окошке (div), при этом на основную страницу накладывается временный слой который блокирует её содержание (как в slimbox при отображении картинок), естественно для этого используется mootools, в коде встречаются такие строки:

    this.eventPosition=this.position.bind(this);

    position:function()
    {
    this.overlay.setStyles({top:Window.getScrollTop()+”px”,height:Window.getHeight()+”px”})
    }

    window[B](”scroll”,this.eventPosition)[B](”resize”,this.eventPosition);

    Я понимаю для чего они нужны, но синтаксис последней строки меня вводит в ступор, не могли бы пояснить как разобрать такую запись (переменная B мне известна)?

  6. @Geolog
    Честно говоря я тоже не знаю, откуда эта переменная, но она явно не относится к mootools. Это надо смотреть весь скрипт, где-то она должна определяться.
    Это может выглядеть так:
    var B = (some_condition_here) ? ‘addEvent’ : ‘removeEvent’;
    window[B](”scroll”,this.eventPosition)[B](”resize”,this.eventPosition);

    То есть, фактически в последней строке будет выполнена функция addEvent либо removeEvent

  7. Строку дописали правильно:

    var B = (some_condition_here) ? ‘addEvent’ : ‘removeEvent’;
    window[B](”scroll”,this.eventPosition)[B](”resize”,this.eventPosition);

    Так и есть и в slimbox и в моём примере, и что в результате получается я тоже понял из контекста программы, я меня интересует синтаксис этой строки:

    window[B](”scroll”,this.eventPosition)[B](”resize”,this.eventPosition);

    Это массив, функция, оператор? Что это – я такую конструкцию первый раз вижу. Буду очень признателен если расшифруете эту синтаксическую конструкцию (откуда она из самого js или mootools).

  8. Что то, или я неправильную библиотеку качнул или не пойму (качал с офф сайта со всепи плагами) но в итоге, консоль ошибок выдает что $ES() not defined и поиском по скрипту не находится результат библиотеку качал последнюю
    пытался сделать чтобы при наведении менялся фон ячейки на которую навели и цвет текста тех ссылок что внутри ячейки.
    function change(obj)
    {
    obj.style.bgcolor = “#000000″;
    $ES(’a',obj).style.color = “#00cc00″;
    }
    просто ява скриптом знаю как делать но получается громоздко

  9. @Metserp
    $ES актуально для предыдущей версии mootools, в новой этого уже нет. Нужно по другому сделать:
    $(obj).getElements(’a').setStyle(’color’,'#00cc00′);

  10. Скачал последнюю библиотеку с офф сайта написал такую функцию (хочу менять цвет фона и ссылки в ячейке (как сделать ява скриптом знаю но хочется освоить эту библиотеку)
    function change(obj)
    {
    obj.style.bgcolor = “#000000″;
    $ES(’a',obj).style.color = “#00cc00″;
    }
    а консоль ошибок возвращает что функции $ES не существует (скрипт подключил ) и в коде скрипта я ненахожу такого сочетания в чем Фишка?

  11. # // получение всех ссылок внутри $(’myElement’)
    # $ES(’a',’myElement’);

    Как сие будет выглядеть в 1.2?

  12. @Serg_pnz
    $$(’#myElement a’);

  13. А как изловчиться в 1.2 и выбрать все элементы с одним id?
    По типу “элементы списка с классом «alt» var aElem = $$(’li.alt’);”

  14. @Serg_pnz
    Так в принципе не должно быть. По правилам, id на странице не должны повторяться. Если делать поиск по ID, то результат может быть непредсказуем. Если уж так получилось, и к примеру, в списке есть элементы с одинаковыми id, то можно получить сам список элементов, а потом проходиться по элементам и проверять id:
    $$(’li’).each(function(el) {
    if (el.id == ’someId) {
    ….
    }
    }

  15. Спасибо, я уж потом позже понял всю несостоятельность идеи и перевел всё на onClick
    А как удалить элемент? Не то, что внутри него, а сам, зная его id.

  16. Простите за беспокойство – нашел
    $(’timspis’).dispose();

  17. Интересная подборка

Оставить комментарий

JSToolbox создан на основе WordPress