РЕКЛАМА |
Иерархическое (многоуровневое)
< Часть 5
|
Реклама
|
var oldstatus=null; //глобальная переменная; //хранит предыдущую строку статуса //Получить SPAN с параметром name равным аргументу функции function getSpan(name){ for (var i=0; i<spans.length; i++) if (spans[i].name==name) return spans[i]; return null; } //Получить DIV с параметром name равным аргументу функции function getDiv(name){ var dvs = divs.item("submenu"); if (dvs != null) for (var i=0; i<dvs.length; i++) if (dvs[i].name==name) return dvs[i]; return null; } //Спрятать все подменю с zIndex >= zIndex текущего подменю // zi и имя (name) текущего подменю function HideGtDiv(zi, dn){ var dvs = divs.item("submenu"); //выделяем из массива divs элементы c id=submenu for (var i=0; i<dvs.length; i++) if (dvs[i].style.zIndex>=zi) if (dvs[i].name!=dn) dvs[i].style.visibility="hidden"; } //Спрятать все подменю выше или равные по иерархии подменю, //содержащее элемент se function HideSubMenu(se){ var spn = menu.getMenuItem(se.name); //получим объект пункта меню с именем элемента se if (spn==null) return; var mb = spn.owner; //mb - подменю-владелец пункта меню var div = getDiv(mb.idname); //найдем DIV с именем текущего подменю if (div==null) return; HideGtDiv(div.style.zIndex,div.name); //спрячем все подменю выше или равные текущему подменю //восстановим строку статуса if (oldstatus!=null) window.status=oldstatus; else window.status=window.defaultStatus; } //Спрятать (скрыть) все подменю function HideAllSubMenu(){ var dvs = divs.item("submenu"); for (var i=0; i<dvs.length; i++) if (dvs[i].className=="submenu") dvs[i].style.visibility="hidden"; } // Функция отображения меню mb function ViewSubMenu(mb){ var obj = getDiv(mb.idname); if (obj == null) return; var spn = getSpan(mb.idname); var offs = 0; var bdy = document.body; var w=0; if (bdy!=null) w=bdy.clientWidth; else w=window.screen.width; if (mb.owner.idname==null) { HideAllSubMenu(); if (spn != null) offs = spn.offsetLeft; obj.style.pixelTop = MainMenuBar.offsetTop + MainMenuBar.offsetHeight; obj.style.pixelLeft = MainMenuBar.offsetLeft+offs; if ((obj.style.pixelLeft + obj.style.pixelWidth)>w) if ((w-obj.style.pixelWidth)>0) obj.style.pixelLeft = w-obj.style.pixelWidth; } else { var ownr = getDiv(mb.owner.idname); if (spn != null) offs = spn.offsetWidth; obj.style.pixelTop = ownr.offsetTop + spn.offsetTop; obj.style.pixelLeft = ownr.offsetLeft+offs-2; if ((obj.style.pixelLeft + obj.style.pixelWidth)>w) if ((ownr.offsetLeft-obj.style.pixelWidth)>0) obj.style.pixelLeft = ownr.offsetLeft-obj.style.pixelWidth+2; } obj.style.visibility=""; } //******* Обработчик для элементов с id=submenu ****** function doEventMenu(){ var e = window.event; var SE = e.srcElement; var TE = e.toElement; if (e.type=="mouseout"){ if (TE==null) return; if (TE.name==null) HideAllSubMenu(); } else if (e.type=="mouseover"){ if (SE==null) return; var mb = menu.getSubMenu(SE.name); if (mb!=null) ViewSubMenu(mb); } } //******* Обработчик для элементов с id=menupunkt ****** function doEventSubMenu(){ var e = window.event; var SE = e.srcElement; if (e.type=="mouseout"){ SE.className = "nonact"; if (oldstatus==null) window.status=window.defaultStatus; else window.status=oldstatus; } else if (e.type=="mouseover"){ SE.className = "active"; HideSubMenu(SE) var mi = null, mb = null; if((mi = menu.getMenuItem(SE.name))==null) return; if(oldstatus==null) oldstatus=window.status; window.status=mi.a; }else if (e.type=="click"){ if((mi = menu.getMenuItem(SE.name))==null) return; if (mi.objname == "item") { if ((mi.a.indexOf("javascript",0)!=-1)||(mi.a.indexOf("jscript",0)!=-1)) eval(mi.a); else { if (oldstatus==null) window.status=window.defaultStatus; else window.status=oldstatus; document.location=mi.a; } HideAllSubMenu(); } }} |
Реклама
Каждому сайту - механизм организации собственной ленты новостей бесплатно! |
Напомним что, функция ConstructMenu так генерирует html-код, что id=submenu имеют тэги SPAN полосы меню и DIV всех подменю. Все остальные пункты подменю (заключенные в тэги SPAN), включая ссылки (указатели) на подменю высшего уровня, имеют id=menupunkt. Эти пункты меню включаются в тэги DIV подменю, так что DIV является контейнером (и владельцем) этих пунктов. События от мыши для этих тэгов созникают согласно принципа всплытия пузырька (event bubbling): сначала событие направляется элементу (тэгу), содержащемуся непосредственно под курсором мышки (самому верхнему), затем элементу, содержащему верхний элемент и т.д. Последними получают событие объекты браузера document и window. (Следует заметить, что этот механизм справедлив лишь для браузера MS Internet Explorer; для других браузеров он может отличаться.) Таким образом, в нашем случае, первым событие получает пункт меню (SPAN), а затем подменю (DIV). При получении события пунктом меню он активизируется. Далее событие получает подменю. Если активный пункт меню является указателем на подменю высшего уровня, то отображается это подменю.
Код обработчика события может получить полезную информацию из свойства event объекта window браузера. В частности свойства объекта event type, srcElement, toElement указывают на тип (строковое представление рода события, например, "mouseover"), элемент активный во время события (элемент-источник) и активизирующийся элемент (для событий перемещения мыши). (Есть и другие свойства event, но мы их рассматривать не будем.) Код обработчика событий для подменю (id=submenu) довольно прост. Если мышь покинула элемент (событие mouseout) и не определен активизирующийся элемент, то все подменю прячутся. Если мышь перешла на элемент (событие mouseover), то в главном меню menu ищется подменю с именем равным имени элемента-источника. Если оно найдено, то его отображают (функция ViewSubMenu); в противном случае ничего не делают. Код обработчика событий для пунктов меню (id=menupunkt) немного более сложен. На событие mouseout (деактивизация) имени класса пункта меню присваивается имя определенного в файле стилей класса "nonact" и восстанавливается строка статуса. При событии mouseover (активизация) класс пункта меню меняется на "active", прячутся все подменю высшего, чем подменю данного пункта, уровня (функция HideSubMenu), ищется в главном меню объект MenuItem с именем, равным имени элемента-источника. URL (поле а) найденного объекта записывается в строку статуса. На событие click (пункт меню выбран) ищется в главном меню объект MenuItem с именем, равным имени элемента-источника. Если найденный элемент ссылка (или JavaScript), а не указатель на подменю высшего уровня, то выполняется переход по URL пукта меню (поле а объекта MenuItem). Для этого в свойство location объекта браузера document записывается данный URL. Если вместо ссылки приведен JavaScript-код (дает положительный результат поиск строк "javascript" или "jscript"), то выполняется команда (функция JavaScript eval). Если пункт меню указатель на подменю высшего уровня, то событие click игнорируется. За отображение подменю отвечает функция ViewSubMenu (mb), где mb объект подменю. Позиционирование (т.е. расположение в окне браузера) подменю различается для подменю нулевого уровня и подменю других уровней. Подменю нулевого уровня находится под пунктом полосы главного меню, в то время как другие подменю слева от пункта-указателя на это подменю. Таким образом, для отображения подменю
Описание остальных функций файла handles.js тривиально и приведено в Листинге 3. [> далее >] © 2000, Сергей Кузнецов
|
Реклама
ВАКАНСИИ (Компьютеры, Интернет). |
Главная / Разное / JavaScript-меню | ^^^ |
© iD, 2000
|