Помогите разобраться с меню-аккордеоном
|
|
[1] papajustify [11.06.2014, 00:22] |
На сайте реализовано меню-аккордеон. Код 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 |
|
[2] likbezz [11.06.2014, 00:38] |
papajustify, На сайте реализовано меню-аккордеон. Код 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>
По-колхозному не вышло, продублировал все для SDMenu2, фига. Не надо так делать..
|
|
[3] papajustify [11.06.2014, 17:35] |
likbezz, Биг сенкс!
Добавлено (11.06.2014, 17:35) --------------------------------------------- likbezz,
а можно ли сделать так, чтобы эти меню были спрятаны в скрипт и не индексировались? Или это уже совсем другая история? Что-то вроде аякс меню, только аккордеон. И чтобы менюхи открывались при наведении, а не клике.
Сообщение отредактировал papajustify - Среда, 11.06.2014, 17:39 |
|
[4] likbezz [12.06.2014, 16:37] |
papajustify, а можно ли сделать так, чтобы эти меню были спрятаны в скрипт и не индексировались? Можно, noindex например..
Что-то вроде аякс меню, только аккордеон. Тоже можно, но не просто.
И чтобы менюхи открывались при наведении, а не клике. Править скрипт menu.js |
|