【发布时间】:2015-07-22 13:39:26
【问题描述】:
我在网上找到了一些手风琴菜单,但要么它们不支持多层次,要么代码非常神秘,我不想使用它。所以我决定,我要编写自己的手风琴菜单,它支持任意数量的子菜单。
这是我目前所拥有的:
$(document).ready(function() {
// at the beginning only the top menu items are visible
$('.multi-level-accordion-menu > li ul').slideUp(0);
console.log('all elements slid up');
// when a menu item which is not active is clicked, show the next lower level
// when a menu item which is active is clicked, hide all its sub menu items
$('.multi-level-accordion-menu li').click(function() {
var menu_item = $(this);
if (is_active(menu_item)) {
console.log('active menu item clicked');
close_menu_item(menu_item);
} else {
console.log('inactive menu item clicked');
open_menu_item(menu_item);
}
});
console.log('READY!');
});
function open_menu_item(menu_item) {
menu_item.children('ul').slideDown(500);
menu_item.addClass('active-menu-item');
}
function close_menu_item(menu_item) {
console.log('1x');
menu_item.find('ul').each(function(index, elem) {
$(elem).slideUp();
return false;
});
menu_item.removeClass('active-menu-item');
}
function is_active(menu_item) {
return menu_item.hasClass('active-menu-item');
}
.multi-level-accordion-menu * {
margin: 0px;
padding: 0px;
}
.multi-level-accordion-menu {
list-style: none;
max-width: 200px;
}
.multi-level-accordion-menu ul {
list-style: none;
}
.multi-level-accordion-menu li {
border-color: #EEEEEE;
border-width: 1px;
border-style: solid;
background-color: #303030;
margin: 2px;
padding: 2px;
line-height: 30px;
font-size: 16px;
}
.multi-level-accordion-menu {
color: #DDDDDD;
}
body {
background-color: #202020;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div>
<ul class='multi-level-accordion-menu'>
<li>Item 1
<ul>
<li>Item 1.1
<ul>
<li>Item 1.1.1</li>
<li>Item 1.1.2</li>
<li>Item 1.1.3</li>
<li>Item 1.1.4</li>
</ul>
</li>
<li>Item 1.2</li>
<li>Item 1.3</li>
<li>Item 1.4</li>
<li>Item 1.5</li>
<li>Item 1.6</li>
</ul>
</li>
<li>Item 2</li>
<li>Item 3
<ul>
<li>Item 3.1
<ul>
<li>Item 3.1.1</li>
<li>Item 3.1.2</li>
<li>Item 3.1.3</li>
<li>Item 3.1.4</li>
</ul>
</li>
<li>Item 3.2</li>
<li>Item 3.3</li>
<li>Item 3.4</li>
<li>Item 3.5</li>
<li>Item 3.6</li>
</ul>
</li>
<li>Item 4</li>
<li>Item 5</li>
<li>Item 6</li>
<li>Item 7</li>
</ul>
</div>
</body>
http://jsfiddle.net/Zelphir/1fp03oyq/1/
点击顶级菜单项可以工作,但是当我点击Item 1 然后Item 1.1 时,很明显,较低的级别还不能工作。子菜单打开,但不知何故同时顶层再次关闭。
如何实现以下行为:
- 单击“非活动”菜单项使其子菜单项可见
- 单击“活动”菜单项会隐藏其子菜单项及其子菜单项
- 一开始所有项目都处于“非活动状态”
【问题讨论】:
-
看看事件冒泡。这似乎是一个经典案例。
-
已经这样做了,这就是为什么您可以在代码中看到
return false;的原因 - 没有帮助,或者它位于代码中的错误位置。你能提供一个有用的答案吗? -
下次把代码放到问题里,jsFiddle已经不够用了……
-
啊,好吧,SO 编辑告诉我,但在某些时候,气泡通知消失了,我想“好吧,似乎只需要防止一个衬里。让帖子保持苗条。”跨度>
标签: jquery html menu accordion jquery-ui-accordion