jquery - 多级 Accordion 菜单改进?

标签 jquery css accordion

我希望构建一个多级 Accordion 菜单。 到目前为止,我已经构建了这个菜单 ( http://codepen.io/anon/pen/ogdovx ),但我是 jquery 的新手,并且已经达到了我的知识极限。

如何改进? 我只需要它来下拉具有子 UL 的元素,并在打开时折叠 sibling / child 。

如果能帮助我改进代码,我们将不胜感激。 干杯!

来自codepen的代码:

$(document).ready(function() {

   $(".main > li > a").click(function() {
      $('.main ul').slideUp();
      if (!$(this).next().is(":visible")) {
        $(this).next().slideDown();
      }
   })

   $(".main > li > ul > li > a").click(function() {
      $('.main ul ul').slideUp();
      if (!$(this).next().is(":visible")) {
        $(this).next().slideDown();
      }
   })

   $(".main ul ul li > a").click(function() {
      $('.main ul ul ul').slideUp();
      if (!$(this).next().is(":visible")) {
        $(this).next().slideDown();
      }
   })
  
});
ul.children {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="main">
  <li class="page_has_children">
    <a href="#">Link</a>
    <ul class="children">
      <li class="page_has_children">
        <a href="#">Sub Link</a>
        <ul class="children">
          <li>
            <a href="#">Sub Sub Link</a>
            <ul class="children">
              <li><a href="#">Child Link</a>
              </li>
              <li><a href="#">Child Link</a>
              </li>
              <li><a href="#">Child Link</a>
              </li>
            </ul>
          </li>
          <li><a href="#">Sub Link</a>
          </li>
          <li><a href="#">Sub Link</a>
          </li>
          <li><a href="#">Sub Link</a>
          </li>
        </ul>
      </li>
      <li class="page_has_children">
        <a href="#">Link</a>
        <ul class="children">
          <li><a href="#">Sub Link</a>
          </li>
          <li><a href="#">Sub Link</a>
          </li>
          <li><a href="#">Sub Link</a>
          </li>
          <li><a href="#">Sub Link</a>
          </li>
        </ul>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
    </ul>
  </li>
  <li class="page_has_children">
    <a href="#">Link</a>
    <ul class="children">
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
    </ul>
  </li>
  <li class="page_has_children">
    <a href="#">Link</a>
    <ul class="children">
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
    </ul>
  </li>
  <li class="page_has_children">
    <a href="#">Link</a>
    <ul class="children">
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
    </ul>
  </li>
</ul>

最佳答案

改进这一点的最明显方法是创建一些句柄,这样您就不必重复太多代码。最简单的方法是在任何父链接上放置一个类。通过这样做,您只需要调用来添加事件处理程序。

$(".parent-link").click(function() {
  var children = $(this).next(); //shorthand for the next ul
  var parents = $(this).parents(".children"); //any uls above me

  //close all other uls not above me in the tree
  $('.children').not(parents).slideUp();
  
  //open this if its closed
  children.filter(":hidden").slideDown();
})
ul.children {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="main">
  <li class=".parent-link">
    <a class="parent-link" href="#">Link</a>
    <ul class="children">
      <li class="page_has_children">
        <a class="parent-link" href="#">Sub Link</a>
        <ul class="children">
          <li>
            <a class="parent-link" href="#">Sub Sub Link</a>
            <ul class="children">
              <li><a href="#">Child Link</a>
              </li>
              <li><a href="#">Child Link</a>
              </li>
              <li><a href="#">Child Link</a>
              </li>
            </ul>
          </li>
          <li><a href="#">Sub Link</a>
          </li>
          <li><a href="#">Sub Link</a>
          </li>
          <li><a href="#">Sub Link</a>
          </li>
        </ul>
      </li>
      <li class="page_has_children">
        <a class="parent-link" href="#">Link</a>
        <ul class="children">
          <li><a href="#">Sub Link</a>
          </li>
          <li><a href="#">Sub Link</a>
          </li>
          <li><a href="#">Sub Link</a>
          </li>
          <li><a href="#">Sub Link</a>
          </li>
        </ul>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
    </ul>
  </li>
  <li class="page_has_children">
    <a class="parent-link" href="#">Link</a>
    <ul class="children">
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
    </ul>
  </li>
  <li class="page_has_children">
    <a class="parent-link" href="#">Link</a>
    <ul class="children">
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
    </ul>
  </li>
  <li class="page_has_children">
    <a class="parent-link" href="#">Link</a>
    <ul class="children">
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
      <li><a href="#">Sub Link</a>
      </li>
    </ul>
  </li>
</ul>

关于jquery - 多级 Accordion 菜单改进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28709303/

相关文章:

CSS 类而不是媒体查询

javascript - 渲染时显示事件量表内半径中的轨迹值总和

jquery - border right 样式不向下延伸 Accordion

javascript - 可拖动和可调整大小的 div

jquery - 当输入包含特定值时,如何使用 jquery 将类添加到输入

javascript - jQuery 如果单选按钮被选中则继续下一个元素

javascript - 如何在引导 Accordion 中将加号切换为减号,反之亦然

javascript - 垂直光滑旋转木马自定义点

css - 访问特定的表格单元格

jquery - Accordion 菜单,第一次单击时展开,如果子菜单展开则转到 URL