Фильтр по:
  

  • Страница 1 из 1
  • 1
Модератор форума: likbezz  
Скрипты и коды для юкоз - Форум аццкого кодера » Как сделать? Информация для вновь прибывших » Как сделать... » Помогите разобраться с меню-аккордеоном
Помогите разобраться с меню-аккордеоном
Дата: Среда, 11.06.2014, 00:22 |
papajustify
Рядовой
Группа: Проверенные
Сообщений: 19
Награды: 0
Репутация: 0
Статус: Offline


На сайте реализовано меню-аккордеон.
Код
http://onlyminecraft.ru/

Но их нужно две штуки, а работает только одно из них (функция привязана к классу, а его две штуки на странице).

Подскажите, плз, где что надо подправить, чтобы заработало оба меню?

скрипт 1

Код
<script type="text/javascript">   
   // <![CDATA[   
   var myMenu;   
   window.onload = function() {   
   myMenu = new SDMenu("my_menu");   
   myMenu.init();   
   };   
   // ]]>   
   </script>


Код

function SDMenu(id) {
   if (!document.getElementById || !document.getElementsByTagName)
    return false;
   this.menu = document.getElementById(id);
   this.submenus = this.menu.getElementsByTagName("div");
   this.remember = true;
   this.speed = 5;
   this.markCurrent = true;
   this.oneSmOnly = false;
}
SDMenu.prototype.init = function() {
   var mainInstance = this;
   for (var i = 0; i < this.submenus.length; i++)
    this.submenus[i].getElementsByTagName("span")[0].onclick = function() {
     mainInstance.toggleMenu(this.parentNode);
    };
   if (this.markCurrent) {
    var links = this.menu.getElementsByTagName("a");
    for (var i = 0; i < links.length; i++)
     if (links[i].href == document.location.href) {
      links[i].className = "current";
      break;
     }
   }
   if (this.remember) {
    var regex = new RegExp("sdmenu_" + encodeURIComponent(this.menu.id) + "=([01]+)");
    var match = regex.exec(document.cookie);
    if (match) {
     var states = match[1].split("");
     for (var i = 0; i < states.length; i++)
      this.submenus[i].className = (states[i] == 0 ? "collapsed" : "");
    }
   }
};
SDMenu.prototype.toggleMenu = function(submenu) {
   if (submenu.className == "collapsed")
    this.expandMenu(submenu);
   else
    this.collapseMenu(submenu);
};
SDMenu.prototype.expandMenu = function(submenu) {
   var fullHeight = submenu.getElementsByTagName("span")[0].offsetHeight;
   var links = submenu.getElementsByTagName("a");
   for (var i = 0; i < links.length; i++)
    fullHeight += links[i].offsetHeight;
   var moveBy = Math.round(this.speed * links.length);
     
   var mainInstance = this;
   var intId = setInterval(function() {
    var curHeight = submenu.offsetHeight;
    var newHeight = curHeight + moveBy;
    if (newHeight < fullHeight)
     submenu.style.height = newHeight + "px";
    else {
     clearInterval(intId);
     submenu.style.height = "";
     submenu.className = "";
     mainInstance.memorize();
    }
   }, 30);
   this.collapseOthers(submenu);
};
SDMenu.prototype.collapseMenu = function(submenu) {
   var minHeight = submenu.getElementsByTagName("span")[0].offsetHeight;
   var moveBy = Math.round(this.speed * submenu.getElementsByTagName("a").length);
   var mainInstance = this;
   var intId = setInterval(function() {
    var curHeight = submenu.offsetHeight;
    var newHeight = curHeight - moveBy;
    if (newHeight > minHeight)
     submenu.style.height = newHeight + "px";
    else {
     clearInterval(intId);
     submenu.style.height = "";
     submenu.className = "collapsed";
     mainInstance.memorize();
    }
   }, 30);
};
SDMenu.prototype.collapseOthers = function(submenu) {
   if (this.oneSmOnly) {
    for (var i = 0; i < this.submenus.length; i++)
     if (this.submenus[i] != submenu && this.submenus[i].className != "collapsed")
      this.collapseMenu(this.submenus[i]);
   }
};
SDMenu.prototype.expandAll = function() {
   var oldOneSmOnly = this.oneSmOnly;
   this.oneSmOnly = false;
   for (var i = 0; i < this.submenus.length; i++)
    if (this.submenus[i].className == "collapsed")
     this.expandMenu(this.submenus[i]);
   this.oneSmOnly = oldOneSmOnly;
};
SDMenu.prototype.collapseAll = function() {
   for (var i = 0; i < this.submenus.length; i++)
    if (this.submenus[i].className != "collapsed")
     this.collapseMenu(this.submenus[i]);
};
SDMenu.prototype.memorize = function() {
   if (this.remember) {
    var states = new Array();
    for (var i = 0; i < this.submenus.length; i++)
     states.push(this.submenus[i].className == "collapsed" ? 0 : 1);
    var d = new Date();
    d.setTime(d.getTime() + (30 * 24 * 60 * 60 * 1000));
    document.cookie = "sdmenu_" + encodeURIComponent(this.menu.id) + "=" + states.join("") + "; expires=" + d.toGMTString() + "; path=/";
   }
};


По-колхозному не вышло, продублировал все для SDMenu2, фига.


Сообщение отредактировал papajustify - Среда, 11.06.2014, 00:26
 
Дата: Среда, 11.06.2014, 00:38 |
likbezz
Аццкий кодер
Группа: Администраторы
Сообщений: 9093
Награды: 23
Репутация: 459
Статус: Unknown


papajustify,
Цитата papajustify, Ср, 11.06.2014, 00:22:15
На сайте реализовано меню-аккордеон.
Код
http://onlyminecraft.ru/

Но их нужно две штуки, а работает только одно из них (функция привязана к классу, а его две штуки на странице).

Подскажите, плз, где что надо подправить, чтобы заработало оба меню?

Код
<script type="text/javascript" src="/js/menu.js"></script>
<script type="text/javascript">   
// <![CDATA[   
var myMenu,myMenu2;   
window.onload = function() {   
myMenu = new SDMenu("my_menu");   
myMenu2 = new SDMenu("my_menu2");   
myMenu.init();   
myMenu2.init();   
};   
// ]]>   
</script>


Цитата papajustify, Ср, 11.06.2014, 00:22:15
По-колхозному не вышло, продублировал все для SDMenu2, фига.

Не надо так делать..

Прикрепления: SDMenu.rar (2.5 Kb)

 
Дата: Среда, 11.06.2014, 17:35 |
papajustify
Рядовой
Группа: Проверенные
Сообщений: 19
Награды: 0
Репутация: 0
Статус: Offline


likbezz,
Биг сенкс! smile

Добавлено (11.06.2014, 17:35)
---------------------------------------------
likbezz,

а можно ли сделать так, чтобы эти меню были спрятаны в скрипт и не индексировались? Или это уже совсем другая история?
Что-то вроде аякс меню, только аккордеон.
И чтобы менюхи открывались при наведении, а не клике.


Сообщение отредактировал papajustify - Среда, 11.06.2014, 17:39
 
Дата: Четверг, 12.06.2014, 16:37 |
likbezz
Аццкий кодер
Группа: Администраторы
Сообщений: 9093
Награды: 23
Репутация: 459
Статус: Unknown


papajustify,
Цитата papajustify, Ср, 11.06.2014, 17:35:43
а можно ли сделать так, чтобы эти меню были спрятаны в скрипт и не индексировались?

Можно, noindex например..

Цитата papajustify, Ср, 11.06.2014, 17:35:43
Что-то вроде аякс меню, только аккордеон.

Тоже можно, но не просто.

Цитата papajustify, Ср, 11.06.2014, 17:35:43
И чтобы менюхи открывались при наведении, а не клике.

Править скрипт menu.js


 
Скрипты и коды для юкоз - Форум аццкого кодера » Как сделать? Информация для вновь прибывших » Как сделать... » Помогите разобраться с меню-аккордеоном
  • Страница 1 из 1
  • 1
Поиск:


Мобильная версия