Brigo
Brigo

Reputation: 1112

Nested collapse

I'm trying to collapse a nested menu with jQuery. I read this answer and, to me, it appears to be similar to my solution. The problem is that mine doesn't work.

What I think I'm saying with my JavaScript code is: "hey, when a user clicks on a li that is the parent of a ul.submenu, get its ul.submenu children and attach the slideToggle only to it". But, as you can see from the snippet, it closes also the parent ul.submenu and I can't understand why.

$(document).ready(function () {

    $('.submenu').hide();

    $('.submenu').parent('li').click(function () {
        $(this).children('ul.submenu').slideToggle("slow");
    });
    
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<nav>
    <ul class="menu">
        <li>Home</li>
        <li>Blog
            <ul class="submenu">
                <li>
                    Author
                    <ul class="submenu">
                        <li>New</li>
                        <li>Handle</li>
                    </ul>
                </li>
                <li>
                    <span>Category</span>
                    <ul class="submenu">
                        <li>New</li>
                        <li>Handle</li>
                    </ul>
                </li>
                <li>
                    <span>Tag</span>
                    <ul class="submenu">
                        <li>New</li>
                        <li>Handle</li>
                    </ul>
                </li>
                <li>
                    <span>Post</span>
                    <ul class="submenu">
                        <li>New</li>
                        <li>Handle</li>
                    </ul>
                </li>
            </ul>
        </li>
        <li>Photo</li>
        <li>Settings</li>
    </ul>
</nav>

Upvotes: 0

Views: 47

Answers (1)

j08691
j08691

Reputation: 207901

You want to stop the click event from bubbling up the DOM and triggering the click handler on the parent. Use .stopPropagation() for that:

$(document).ready(function() {
  $('.submenu').hide();
  $('.submenu').parent('li').click(function(e) {
    e.stopPropagation()
    $(this).children('ul.submenu').slideToggle("slow");
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<nav>
  <ul class="menu">
    <li>Home</li>
    <li>Blog
      <ul class="submenu">
        <li>
          Author
          <ul class="submenu">
            <li>New</li>
            <li>Handle</li>
          </ul>
        </li>
        <li>
          <span>Category</span>
          <ul class="submenu">
            <li>New</li>
            <li>Handle</li>
          </ul>
        </li>
        <li>
          <span>Tag</span>
          <ul class="submenu">
            <li>New</li>
            <li>Handle</li>
          </ul>
        </li>
        <li>
          <span>Post</span>
          <ul class="submenu">
            <li>New</li>
            <li>Handle</li>
          </ul>
        </li>
      </ul>
    </li>
    <li>Photo</li>
    <li>Settings</li>
  </ul>
</nav>

Upvotes: 2

Related Questions