Search code examples
jquerycssaccordionpseudo-elementsubmenu

How to use a pseudo element added with jquery with the click function


The code I put in works but I would like to use that arrow class that was previously created, instead of using li.parent in this way $('.Arrow').click(function ()... but it does not work for me it is possible to achieve it?

$('ul#nav li.parent').before('<a class="arrow" href="#"></a>');

$(document).ready(function() {
  $('.parent').click(function() {
    $('.parent').not(this).find('.sub-nav.visible').removeClass('visible');
    $('.sub-nav', this).toggleClass('visible'); //find .sub-nav of clicked .parent
  });
});
#nav ul.sub-nav {
  display: none;
}

#nav ul.visible {
  display: block;
}

.arrow {
  width: 10px;
  height: 10px;
  background: red;
  display: inline-block;
  float: right;
  position: relative;
  right: 50%;
  margin-top: 5px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul id="nav">
  <li class="parent">Home
    <ul class="sub-nav">
      <li>One</li>
      <li>Two</li>
      <li>Three</li>
    </ul>
  </li>
  <li class="parent">About
    <ul class="sub-nav">
      <li>First</li>
      <li>Second</li>
      <li>Third</li>
    </ul>
  </li>
  <li class="parent">Contact</li>
</ul>


Solution

  • $('.sub-nav').before('<a class="arrow" href="#"></a>');
    
    $(document).ready(function() {
      $('.arrow').click(function() {
        var list = $(this).parent()
        var subList = $(list).children('.sub-nav')
        if(!$(subList).hasClass('visible')) {
        	$('.parent').not(this).find('.sub-nav.visible').removeClass('visible');
        }
        $(subList).toggleClass('visible');
      });
    });
    #nav ul.sub-nav {
      display: none;
    }
    #nav ul.visible {
      display: block;
    }
    .arrow {
      width: 10px;
      height: 10px;
      background: red;
      display: inline-block;
      float: right;
      position: relative;
      right: 50%;
      margin-top: 5px;
      cursor: pointer;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <ul id="nav">
      <li class="parent">Home
        <ul class="sub-nav">
          <li>One</li>
          <li>Two</li>
          <li>Three</li>
        </ul>
      </li>
      <li class="parent">About
        <ul class="sub-nav">
          <li>First</li>
          <li>Second</li>
          <li>Third</li>
        </ul>
      </li>
      <li class="parent">Contact</li>
      <li class="parent">Help
        <ul class="sub-nav">
          <li>First</li>
          <li>Second</li>
          <li>Third</li>
        </ul>
      </li>
      <li class="parent">Argon
        <ul class="sub-nav">
          <li>First</li>
          <li>Second</li>
          <li>Third</li>
        </ul>
      </li>
    </ul>

    Tidied up the code base a bit but this should get you what you are looking for.

    EDIT

    Added an if statement to the JS file that will handle a repeat click on a list that will toggle the list.