【问题标题】:JQuery slidetoggle nested lists closing open list not workingJQuery slidetoggle嵌套列表关闭打开列表不起作用
【发布时间】:2019-03-03 21:24:38
【问题描述】:

我有一个简单的嵌套列表,如下所示:

<ul class='main'>
  <li class='mainlink'><a href='#'>Main 1</a>
    <ul class='sub'>
      <li><a href='#'>Sub 1-1</a>
        <li><a href='#'>Sub 1-2</a>
          <li><a href='#'>Sub 1-3</a>
    </ul>
    </li>
    <li class='mainlink'><a href='#'>Main 2</a>
      <ul class='sub'>
        <li><a href='#'>Sub 2-1</a>
          <li><a href='#'>Sub 2-2</a>
            <li><a href='#'>Sub 3-3</a>
      </ul>
      </li>
      <li class='mainlink'><a href='#'>Main 3</a>
        <ul class='sub'>
          <li><a href='#'>Sub 3-1</a>
            <li><a href='#'>Sub 3-2</a>
              <li><a href='#'>Sub 3-2</a>
        </ul>
        </li>
</ul>

这是我的 jQuery:

$( ".mainlink" ).click(function() { 
    var child = $(this).children('.sub');
    var rest = $('.sub:visible').not(child);     
    child.slideToggle();
    rest.slideUp();    
});

单击.mainlink 应打开其子列表.sub 并关闭所有其他打开的子列表。这部分按预期工作,但在打开 .sub 的情况下单击 .mainlink 会关闭 .sub 并在之后立即打开它,而不是在下一次单击发生之前保持关闭状态。

问题可能很容易解决,但我显然无法找到正确的方法。感谢您的帮助。

拉尔夫

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    试试这个:

    $(document).ready(function(){
       $( ".mainlink > a" ).click(function() { 
            $('.main .sub').not($(this)).slideUp();
            var child = $(this).parent().children('.sub');
            if(!child.is(":visible")){
                child.slideDown();      
            }    
      });
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <ul class='main'>
    <li class='mainlink'><a href='#'>Main 1</a>
    <ul class='sub' style='display:none'>
    <li><a href='#'>Sub 1-1</a>
    <li><a href='#'>Sub 1-2</a>
    <li><a href='#'>Sub 1-3</a>
    </ul>
    </li>
    <li class='mainlink'><a href='#'>Main 2</a>
    <ul class='sub' style='display:none'>
    <li><a href='#'>Sub 2-1</a>
    <li><a href='#'>Sub 2-2</a>
    <li><a href='#'>Sub 3-3</a>
    </ul>
    </li>
    <li class='mainlink'><a href='#'>Main 3</a>
    <ul class='sub' style='display:none'>
    <li><a href='#'>Sub 3-1</a>
    <li><a href='#'>Sub 3-2</a>
    <li><a href='#'>Sub 3-2</a>
    </ul>
    </li>
    </ul>

    【讨论】:

    • 感谢您的重播,但运气不佳:单击打开菜单将其关闭,然后立即打开。
    • 宾果游戏!现在一切都做得很好!非常感谢,赛义德。
    【解决方案2】:

    关闭所有.sub,然后打开用户选择的.sub

    演示

    $(".mainlink a").on('click', function() {
      var subMenu = $(this).next('.sub');
      $('.sub').slideUp();
      if (subMenu.is(':visible')) {
        subMenu.slideUp();
      } else {
        subMenu.slideDown();
      }
    });
    <ul class='main'>
      <li class='mainlink'>
        <a href='#'>Main 1</a>
        <ul class='sub' style='display:none'>
          <li><a href='#'>Sub 1-1</a></li>
          <li><a href='#'>Sub 1-2</a></li>
          <li><a href='#'>Sub 1-3</a></li>
        </ul>
      </li>
      <li class='mainlink'>
        <a href='#'>Main 2</a>
        <ul class='sub' style='display:none'>
          <li><a href='#'>Sub 2-1</a></li>
          <li><a href='#'>Sub 2-2</a></li>
          <li><a href='#'>Sub 3-3</a></li>
        </ul>
      </li>
      <li class='mainlink'>
        <a href='#'>Main 3</a>
        <ul class='sub' style='display:none'>
          <li><a href='#'>Sub 3-1</a></li>
          <li><a href='#'>Sub 3-2</a></li>
          <li><a href='#'>Sub 3-2</a></li>
        </ul>
      </li>
    </ul>
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

    【讨论】:

    • 您好,zerOOne,感谢您的建议,您的代码也运行良好。因为我已经将 Saeed 的答案标记为正确的答案,所以我只能投票。编辑:可悲的是,我什至不能投票,因为我的声誉太低了。有时会出现奇怪的规则。
    • 很好@Ralf,谢谢你这么体贴。快乐编码。 ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多