« Кэш Для Вики. Часть 2 | Сложные интерфейсы на javascript вместе Yahoo UI. Часть 4 » |
Сложные интерфейсы на javascript вместе Yahoo UI. Часть 3
Сегодня я продолжаю рассказывать об одной из лучших javascript-библиотек для построения сложных и “богатых” пользовательских интерфейсов - yui (yahoo user interface). В прошлых двух статьях мы изучили модули dom, selector, events, animation, logger и тем самым заложили хороший фундамент для перехода к изучению, нет, не более сложной, но более интересной теме – работе с компонентами пользовательского интерфейса.Вот перечень модулей yui содержащих различные визуальные компоненты: Layout Manager (позиционирование других визуальных компонентов), Button (кнопки, простые и не очень), Calendar (календарь), Charts (построение графиков), ColorPicker (окно выбора цвета), Container (основа для создания многих сложносоставных элементов управления), DataTable (сетка или таблица с данными), Resize (этот компонент добавляет возможность динамически менять размеры некоторого контейнера), Rich Text Editor (html-редактор), Slider (ползунки), TabView (набор закладок), TreeView (старое-доброе дерево), Menu (меню для сайта с несколькими уровнями вложенности) и последний компонент Uploader добавляет улучшенную поддержку загрузки файлов на сервер. Вот вкратце и план дальнейшего изучения yui. Откровенно говоря, в составе yui есть и еще несколько модулей, например: поддержка Drag&Drop, возможности работы с cookie и поддержка ajax. Но все эти темы будут рассмотрены вместе со своими “большими братьями”, так “особый шик” будет иметь шанс попробовать создать в yui на странице таблицу для данных, а сами же данные будут загружены с сервера с помощью ajax.
Первым на рассмотрении будет создание меню. Для этого мы используем возможности модуля Menu, который нужно подключить в секции head вашего html-файла. Для этого и всех последующих примеров я использую загрузку модулей с помощью yahoo Loader (о котором я подробно рассказал в прошлой статье). Все действия по инициализации компонентов выполняются в обработчике события “и DOM загружен и модули тоже”:
loader = new YAHOO.util.YUILoader();
loader.require(["menu"]);
loader.loadOptional = true;
loader.base = 'js/';
loader.insert({ onSuccess: loadCompleted});
// после загрузки всех необходимых модулей
function loadCompleted (){
YAHOO.util.Event.onDOMReady (onDOMReadyHandler);
}
function onDOMReadyHandler (){
startApp();
}
function startApp (){
/* делай это */
}
Сразу же нужно выделить важный момент. Создавать и настраивать поведение yui компонентов возможно двумя способами: с помощью специальной html-разметки и программно с помощью javascript. Большой разницы между этими двумя подходами нет, и хотя в начале я покажу два способа, но в последующем буду стараться избегать html-кода как слишком не гибкого и довольно громоздкого. Итак, поехали. Самое простое меню должно быть создано внутри некоторого div блока и иметь структуру, заданную с помощью элемента UL (сам список) и LI (элементы меню). Тег div с классом bd создает для меню эффект тени (см. рис. 1).
Для начала я написал js-код, который создает yahoo объект меню, указав ему в качестве параметра имя элемента содержащего внутри себя содержимое меню:
menu = new YAHOO.widget.Menu("menu");
menu.render ();
<div id="menu" class="yuimenu">
<div class="bd">
<ul class="first-of-type">
<li class="yuimenuitem">
<a class="yuimenuitemlabel" href="http://black-zorro.com">Apple</a>
</li>
<li class="yuimenuitem">
<a class="yuimenuitemlabel" href="http://black-zorro.com"> Orange</a>
</li>
</ul>
</div>
</div>
menu.addItems([
{ text: "Apple", url: "http://..." },
{ text: "Orange", url: "http://..." }
]);
menu.addItems(
[
{ text: "Apple", url: "http://black-zorro.com" },
{ text: "Orange", url: "http://black-zorro.com" }
], 0);
menu.addItems(
[
{ text: "Red", url: "http://black-zorro.com" },
{ text: "Green", url: "http://black-zorro.com" }
], 1);
menu.setItemGroupTitle("Fruits", 0);
menu.setItemGroupTitle("Colors", 1);
Для этого при перечислении содержимого меню, всего лишь нужно указать в качестве параметров не только характеристики text и url, но и параметр submenu. Его значением будет еще один вложенный объект, содержащий внутри элемента itemdata перечень дочерних элементов меню. Если же хочется уже не двух уровневого меню, а трехуровневого, то нужно всего лишь повторить описанный выше трюк еще раз:
menu.addItems(
[
{ text: "Animals" , url:"http://" ,
submenu : {
id: "animals",
itemdata:
[
{text:"Bird", url: "http://"},
{text:"Fish", url: "http://"}
]
}
}
]
);
Добиться такого эффекта очень легко: все, что нужно так это в качестве значения атрибута itemdata передать не массив, состоящий из объектов (отдельных элементов меню), а именно из массивов элементов. Т.е. каждый подмассив должен содержать уже конкретные объекты, соответствующие пунктам меню. Каждый раз, когда мы создаем новый пункт меню, то можем управлять не только его текстовой надписью и адресом перехода при активации данного пункта меню. Еще можно имитировать (увы, но не слишком удачно) “настоящее меню в windows”. Прежде всего, определенные пункты меню можно заблокировать (свойство “disabled: true”). Еще можно настроить меню так, чтобы некоторый пункт меню был бы уже выбран (выделен) сразу после появления меню на экране, для этого я устанавливаю свойство элемента меню “selected: true”. Параметр “checked: true” служит для того, чтобы задать для некоторого элемента меню отметку-checkbox “пункт меню выбран” (см. рис. 4).
Остальные параметры меню относятся к вопросу визуализации и не все типовые задачи имеют легкие решения. Например, если необходимо сопоставить каждому пункту меню некоторую иконку, то стандартной функции для этого вы не найдете, и приходится манипулировать построенным из javascript фрагментом дерева DOM. При программном построении меню в страницу встраивается html-код один-к-одному с показанным мною в самом начале статьи набором тегов ul & li. Это несложно, но неприятно. Например, в следующем примере я добавлю новый пункт меню. Затем значение, возвращенное функцией addItem (если вы использовали для добавления функцию addItems, то вам будет возвращен массив) я использую для “тонкой” настройки внешнего вида меню. Так поле element хранит ссылку на html-элемент представления пункта меню (“li” – элемент списка, а внутри “li” находится “a”). Затем, используя старый-добрый css я добавляю к пункту меню иконку:
var mi = menu.addItem({text: "Green", url:"http://color.com"});
mi.element.style.backgroundImage = 'url(diskget_sm.gif)';
mi.element.style.backgroundPosition = 'right bottom';
mi.element.style.backgroundRepeat = 'no-repeat';
Что касается остальных свойств настройки внешнего вида меню, то начнем мы с рассмотрения модификатора position. Есть два варианта того, как меню может быть расположено на странице: статически (static) или динамически (dynamic).
new YAHOO.widget.Menu("menu", {position: 'dynamic'});
new YAHOO.widget.Menu("menu", { position: "static", hidedelay: 2000, showdelay: 1000});
new YAHOO.widget.Menu("menu",
{
effect: {
effect: YAHOO.widget.ContainerEffect.FADE,
duration: 1
}
});
Когда говорят об меню, то почти всегда вспоминают об еще нескольких элементах управления решающих сходные задачи. Прежде всего, это контекстное меню, появляющееся при правом клике мыши по любой части html-странички. Никаких изменений в работе с контекстным меню по сравнению с “обычным” нет. Действительно, контекстное меню представляется классом YAHOO.widget.ContextMenu, наследником от знакомого нам класса Menu. Для демонстрации работы контекстного меню я создал блок div (с идентификатором равным “block”), который будет реагировать на нажатие правой кнопки мыши. Затем я пишу следующий javascript-код:
var items = [
{ text: "Apple", url:"http://" },
{ text: "Orange", url:"http://" }
];
new YAHOO.widget.ContextMenu("generateto",
{trigger: "block", itemdata: items, lazyload: true}
);
{ text: "buy Apple for 13$", onclick:
{fn: doFruit, obj: ['apple', 13]}
}
function doFruit (eventType, eventObj , args){
fruit = args [0];
price = args [1];
alert ('eventType='+eventType+ "; eventObj= "+ eventObj+"; fruit="+fruit+"; price="+price);
}
Еще одной разновидностью меню является menubar. В этом случае меню “прилипает” к верхней части окна браузера, пункты меню расположены горизонтально. Одним словом, меню ведет себя точь-в-точь как главное меню ms word, в котором я набираю эти строки (см. рис. 6).
var items = [
{ text: "Apple", submenu :
{
id:"apple",
itemdata:[
{text: "Buy"}, {text: "Sell"}, {text: "Wait a little"}
]
}
},
{ text: "Orange", url:"http://" }
];
var bar = new YAHOO.widget.MenuBar("barplaceholder",
{
lazyload: true,
itemdata: items
}
);
bar.render(document.body);
Сегодняшняя статья была полностью посвящена вопросу как создать меню и рассмотрению его разновидностей. Как ни странно, но к теме работы с меню мы еще вернемся, когда будем учиться работать с деревом и таблицей: тогда мы научимся встраивать вызов контекстного меню для определенных строк таблицы или узлов дерева. Также меню пригодится при рассмотрении особого вида кнопок с выпадающим списком под-вариантов. Вот такой богатый и многогранный компонент. В следующий раз я продолжаю рассказ об визуальных элементах управления, и нас ждут кнопки, диалоговые окна, несколько видов контейнеров, например, набор закладок и многое другое.
« Кэш Для Вики. Часть 2 | Сложные интерфейсы на javascript вместе Yahoo UI. Часть 4 » |