【问题标题】:jQuery multilevel submenujQuery 多级子菜单
【发布时间】:2015-08-02 14:12:35
【问题描述】:

好吧,这可能很简单,但做不到……

我想做的是一个多级支持的子菜单

现在一步一步来:

  1. 用“ul”隐藏所有“li”

  2. 点击时将“Show-subnav”类添加到 li > ul 以显示子导航

问题:所有点击的li > ul都保持打开状态

如何关闭之前点击的子导航?

例如:当您单击 Item1 时,它会显示 Item1 > Level 1 子导航,但即使在单击 Item 2 子导航后仍保持打开状态。单击第 2 项时,第 1 项应关闭。

feel free to edit this pen

$(document).ready(function() {

  // Toggle Sub Nav
  $("#nav li:has(ul)").children("ul").hide(); // hide the li UL
  $("#nav li:has(ul)").find("a").click(function() {
    // Add .show-subnav class to revele on click
    $(this).parent().find("ul:first").toggleClass("show-subnav");
    // how to hide previously clicked submenus?
  });

});
#nav .show-subnav {
  display: block!important;
}
<!-- Nav primary start  -->
<nav id="nav">
  <ul>
    <li><a href="#">Item 1 Submenu</a>
      <ul>
        <li><a href="#">Level 1 Submenu</a>
          <ul>
            <li><a href="#">Level 2 </a>
            </li>
            <li><a href="">Level 2 </a>
            </li>
            <li><a href="">Level 2</a>
            </li>
            <li><a href="">Level 2</a>
            </li>
            <li><a href="#">Level 2</a>
            </li>
          </ul>
        </li>
        <li><a href="#">Level 1 </a>
        </li>
        <li><a href="#">Level 1 </a>
        </li>
        <li><a href="#">Level 1 </a>
        </li>
        <li><a href="#">Level 1 </a>
        </li>
        <li><a href="#">Level 1 </a>
        </li>
      </ul>
    </li>
    <li><a href="#">Item 2 Submenu</a>
      <ul>
        <li><a href="#">Level 1 </a>
        </li>
        <li><a href="#">Level 1 </a>
        </li>
        <li><a href="#">Level 1 </a>
        </li>
        <li><a href="#">Level 1 </a>
        </li>
        <li><a href="#">Level 1 </a>
        </li>
      </ul>
    </li>
    <li><a href="#section-3">Link 3</a>
    </li>
    <li><a href="#section-4">Link 4</a>
    </li>
    <li><a href="#section-5">Link 5</a>
    </li>
  </ul>
</nav>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【问题讨论】:

    标签: jquery menu nav multi-level


    【解决方案1】:

    使用.removeClass() 删除已经打开的ul

    $(document).ready(function() {
    
      // Toggle Sub Nav
      $("#nav li:has(ul)").children("ul").hide(); // hide the li UL
      $("#nav li:has(ul)").find("a").click(function() {
        var parent = $(this).parent()
        parent.siblings().find("ul.show-subnav").removeClass("show-subnav");
        parent.find("ul:first").toggleClass("show-subnav");
      });
    
    });
    

    $(document).ready(function() {
    
      // Toggle Sub Nav
      $("#nav li:has(ul)").children("ul").hide(); // hide the li UL
      $("#nav li:has(ul)").find("a").click(function() {
        // Add .show-subnav class to revele on click
        var parent = $(this).parent()
        parent.siblings().find("ul.show-subnav").removeClass("show-subnav");
        parent.find("ul:first").toggleClass("show-subnav");
        // how to hide previously clicked submenus?
      });
    
    });
    #nav .show-subnav {
      display: block!important;
    }
    <!-- Nav primary start  -->
    <nav id="nav">
      <ul>
        <li><a href="#">Item 1 Submenu</a>
          <ul>
            <li><a href="#">Level 1 Submenu</a>
              <ul>
                <li><a href="#">Level 2 </a>
                </li>
                <li><a href="">Level 2 </a>
                </li>
                <li><a href="">Level 2</a>
                </li>
                <li><a href="">Level 2</a>
                </li>
                <li><a href="#">Level 2</a>
                </li>
              </ul>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
          </ul>
        </li>
        <li><a href="#">Item 2 Submenu</a>
          <ul>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
          </ul>
        </li>
        <li><a href="#section-3">Link 3</a>
        </li>
        <li><a href="#section-4">Link 4</a>
        </li>
        <li><a href="#section-5">Link 5</a>
        </li>
      </ul>
    </nav>
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

    【讨论】:

    • 嗨 Shaunak 感谢您的帮助...这正是我想要的。知道如何使子菜单指示器与此编解码器一起使用吗?只需将 .acticve-submenu 切换到 ul > li 让我知道...谢谢哥们!
    【解决方案2】:

    这是一种方法。您也可以使用 .children() 方法代替父方法。

    $(document).ready(function() {
    
      // Toggle Sub Nav
      $("#nav li:has(ul)").children("ul").hide(); // hide the li UL
      $("#nav li:has(ul)").find("a").click(function(e) {
        // Add .show-subnav class to revele on click
        var $clicked = $(this),
            theClass = 'show-subnav';
        
        $('.'+theClass).each(function(i,v) {//iterate all the opened uls
          if (!$clicked.parents('.'+ theClass).length == 1) {//check if clicked element has a ul with the opened Css Class, and remove that class if condition fails
            $(v).removeClass(theClass);
          }
        });
        $(this).parent().find("ul:first").toggleClass(theClass);
        // how to hide previously clicked submenus?
      });
    
    });
    #nav .show-subnav {
      display: block!important;
    }
    <!-- Nav primary start  -->
    <nav id="nav">
      <ul>
        <li><a href="#">Item 1 Submenu</a>
          <ul>
            <li><a href="#">Level 1 Submenu</a>
              <ul>
                <li><a href="#">Level 2 </a>
                </li>
                <li><a href="">Level 2 </a>
                </li>
                <li><a href="">Level 2</a>
                </li>
                <li><a href="">Level 2</a>
                </li>
                <li><a href="#">Level 2</a>
                </li>
              </ul>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
          </ul>
        </li>
        <li><a href="#">Item 2 Submenu</a>
          <ul>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
            <li><a href="#">Level 1 </a>
            </li>
          </ul>
        </li>
        <li><a href="#section-3">Link 3</a>
        </li>
        <li><a href="#section-4">Link 4</a>
        </li>
        <li><a href="#section-5">Link 5</a>
        </li>
      </ul>
    </nav>
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

    【讨论】:

      【解决方案3】:

      从子 ul 元素中移除开放类

      $(document).ready(function() {
        $("#nav li:has(ul) > a").click(function() {
          var $ul = $(this).next("ul").toggleClass("show-subnav");
          $ul.find('ul.show-subnav').removeClass('show-subnav');
          $('#nav ul.show-subnav').not($ul.parentsUntil('#nav', 'ul').add($ul)).removeClass('show-subnav')
        });
      });
      #nav .show-subnav {
        display: block;
      }
      #nav li > ul {
        display: none;
      }
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <!-- Nav primary start  -->
      <nav id="nav">
        <ul>
          <li><a href="#">Item 1 Submenu</a>
            <ul>
              <li><a href="#">Level 1 Submenu</a>
                <ul>
                  <li><a href="#">Level 2 </a>
                  </li>
                  <li><a href="">Level 2 </a>
                  </li>
                  <li><a href="">Level 2</a>
                  </li>
                  <li><a href="">Level 2</a>
                  </li>
                  <li><a href="#">Level 2</a>
                  </li>
                </ul>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
            </ul>
          </li>
          <li><a href="#">Item 2 Submenu</a>
            <ul>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
            </ul>
          </li>
          <li><a href="#section-3">Link 3</a>
          </li>
          <li><a href="#section-4">Link 4</a>
          </li>
          <li><a href="#section-5">Link 5</a>
          </li>
        </ul>
      </nav>

      【讨论】:

      • 好!顺便说一句,我不是问题的所有者:)
      【解决方案4】:

      $(document).ready(function() {
      $('#nav li a').click(function(e){
      if($(this).hasClass('clicked')){
      $(this).removeClass('clicked').next('ul').slideUp(500);
      }
      else if($(this).parents().siblings('a').hasClass('clicked')){
      $('.clicked').slideDown();
      $(this).addClass('clicked').next('ul').slideDown(500);	
      }
      else{
      $('#nav li a').removeClass('clicked').next('ul').slideUp(500);
      $(this).addClass('clicked').next('ul').slideDown(500);	
      }
      })
      	
      });
      #nav .show-subnav {
        display: block;
      }
      #nav li > ul {
        display: none;
      }
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <!-- Nav primary start  -->
      <nav id="nav">
        <ul>
          <li><a href="#">Item 1 Submenu</a>
            <ul>
              <li><a href="#">Level 1 Submenu</a>
                <ul>
                  <li><a href="#">Level 2 </a>
                  </li>
                  <li><a href="">Level 2 </a>
                  </li>
                  <li><a href="">Level 2</a>
                  </li>
                  <li><a href="">Level 2</a>
                  </li>
                  <li><a href="#">Level 2</a>
                  </li>
                </ul>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
            </ul>
          </li>
          <li><a href="#">Item 2 Submenu</a>
            <ul>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
              <li><a href="#">Level 1 </a>
              </li>
            </ul>
          </li>
          <li><a href="#section-3">Link 3</a>
          </li>
          <li><a href="#section-4">Link 4</a>
          </li>
          <li><a href="#section-5">Link 5</a>
          </li>
        </ul>
      </nav>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-25
        • 1970-01-01
        • 1970-01-01
        • 2013-07-21
        • 1970-01-01
        • 2015-07-22
        • 2017-02-18
        • 1970-01-01
        相关资源
        最近更新 更多